大家好,今天介绍一下工厂模式。首先,我们知道简单工厂模式的缺点,那就是它是写死的,拿我上个写得例子来说 简单工厂
如果要扩展的话,则要修改源代码,这样如果以后产生的Phone类型很多,那么就要一直修改,代码维护成本高(如果万一你哪个类型写错了怎么办)
所以出现了工厂模式。
工厂模式简单来说就是一个工厂对应一个产品。比如说IPhoneFactory产生IPhone系列的手机,XiaoMiFactory产生XiaoMi系列的手机。
让我们看看UML图吧。
看下代码吧
首先是Phone接口
package edu.fjnu.cs.hwb.factory; public interface Phone { void call(); }然后是具体的实现类
首先是IPhone4的
package edu.fjnu.cs.hwb.factory; import edu.fjnu.cs.hwb.factory.*; public class IPhone4 implements Phone { @Override public void call() { // TODO Auto-generated method stub System.out.println("i am iphone4"); } }之后是IPhone4s的
package edu.fjnu.cs.hwb.factory; import edu.fjnu.cs.hwb.factory.*; public class IPhone4s implements Phone { @Override public void call() { // TODO Auto-generated method stub System.out.println("i am iphone4s"); } }之后是XiaoMi2的
package edu.fjnu.cs.hwb.factory; import edu.fjnu.cs.hwb.factory.*; public class XiaoMi2 implements Phone { @Override public void call() { // TODO Auto-generated method stub System.out.println("i am xiaomi2"); } }
package edu.fjnu.cs.hwb.factory; import edu.fjnu.cs.hwb.factory.*; public class XiaoMi2s implements Phone { @Override public void call() { // TODO Auto-generated method stub System.out.println("i am xiaomi2s"); } }好了,现在看看工厂吧
package edu.fjnu.cs.hwb.factory; //定义工厂接口 public interface PhoneFactory { Phone getPhone(String name); }在看看对应的工厂
首先是IPhone的工厂
package edu.fjnu.cs.hwb.factory; public class IPhoneFactory implements PhoneFactory { public Phone getPhone(String name) { Phone phone = null; if(name.equalsIgnoreCase("iphone4")) { phone = new IPhone4(); } else if(name.equalsIgnoreCase("iphone4s")) { phone = new IPhone4s(); } else { throw new RuntimeException("没有该类型的手机"); } return phone; } }
package edu.fjnu.cs.hwb.factory; public class XiaoMiFactory implements PhoneFactory { @Override public Phone getPhone(String name) { Phone phone = null; if(name.equalsIgnoreCase("xiaomi2")) { phone = new XiaoMi2(); } else if(name.equalsIgnoreCase("xiaomi2s")) { phone = new XiaoMi2s(); } else { throw new RuntimeException("没有该类型的手机"); } return phone; } }
package edu.fjnu.cs.hwb.factory; /** * * 工厂模式: * 抽象出一个工厂,还有手机类 * 分门别类的为每个手机做一个工厂,该工厂专门为某个手机服务 */ public class Client { public static void main(String[] args) { PhoneFactory phoneFactory = new IPhoneFactory(); Phone phone = phoneFactory.getPhone("Iphone4s"); phone.call(); phone = phoneFactory.getPhone("iphone4"); phone.call(); phoneFactory = new XiaoMiFactory(); phone = phoneFactory.getPhone("xiaomi2"); phone.call(); phone = phoneFactory.getPhone("xiaomi2s"); phone.call(); try{ phoneFactory = new XiaoMiFactory(); phone = phoneFactory.getPhone("xiaomi2w"); phone.call(); phone = phoneFactory.getPhone("xiaomi2s"); phone.call(); } catch(Exception ex) { ex.printStackTrace(); } } }结果
总结一下:工厂模式比简单工厂好一点,至少它容易扩展了。但是如果有多个产品的话,那么不就意味这要弄多个工厂?(假设我们现在需要Computer,那就意味着还要写多个工厂),所以就会出现了抽象工厂设计模式,抽象工厂就是要针对产品族的!
下次再讲抽象工厂。
如果有讲不对的,请指出来。
原文:http://blog.csdn.net/hwb1992/article/details/22719595