开始之前
插播一个设计原则:依赖倒置原则
依赖倒置原则:要依赖抽象,不要依赖具体类
定义
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
UML类图
分析: 可以看到Client只与抽象的工厂类,及抽象的产品类有关联。利用这此抽象类或接口书写代码,我们的代码将从具体类解耦,这也就遵守了上面提到的一个设计原则:依赖倒置原则。
实例
一个买手机的例子,我们到PhoneStore买手机。然后商店根据我们选择的手机品牌,开始制作手机,手机中有两个主要部件:cpu,主板。下图是uml类图:
关键代码:
1>Cpu,Mainboard
public abstract class Cpu { String name; public Cpu(String name) { this.name = name; } public String cpuInfo() { return " " + name+" "; } } public abstract class Mainboard { String name; public Mainboard(String name) { this.name = name; } public String mainboardInfo() { return " " + name+" "; } }
2>MotoCpu,NokiaCpu
public class MotoCpu extends Cpu { public MotoCpu(String name) { super(name); } } public class NokiaCpu extends Cpu { public NokiaCpu(String name) { super(name); } }
3>MotoMainboard,NokiaMainboard
public class MotoMainboard extends Mainboard{ public MotoMainboard(String name) { super(name); } } public class NokiaMainboard extends Mainboard { public NokiaMainboard(String name) { super(name); } }
4>PhonePartsFacotry
public abstract class PhonePartsFacotry { public abstract Cpu createCpu(); public abstract Mainboard createMainboard(); }
5>MotoPhonePartsFacotry ,NokiaPhonePartsFacotry
public class MotoPhonePartsFacotry extends PhonePartsFacotry { @Override public Cpu createCpu() { return new MotoCpu("MotoCpu"); } @Override public Mainboard createMainboard() { return new MotoMainboard("MotoMainboard"); } } public class NokiaPhonePartsFacotry extends PhonePartsFacotry { @Override public Cpu createCpu() { return new NokiaCpu("NokiaCpu"); } @Override public Mainboard createMainboard() { // TODO Auto-generated method stub return new NokiaMainboard("NokiaMainboard"); } }
6>PhoneStore
public class PhoneStore { PhonePartsFacotry facotry; public PhoneStore(PhonePartsFacotry facotry) { this.facotry = facotry; } public Phone buyPhone() { if (facotry instanceof MotoPhonePartsFacotry) { return new MotoPhone("MotoPhone", facotry); } else { return new NokiaPhone("NokiaPhone", facotry); } } }
测试
import org.junit.Test; public class Testtt { @Test public void test() { PhoneStore store = new PhoneStore(new MotoPhonePartsFacotry()); Phone phone = store.buyPhone(); phone.phoneInfo(); } }
输出:
总结:
前面两篇:初学设计模式【4】简单工厂模式——SimpleFactory
初学设计模式【5】工厂方法模式——FactoryMethod
到现在三种工厂模式都说完了,这里再对它们作一个简单的对比:
1>共性:
这几种工厂模式都是用来封装创建对象的代码,降低客户代码对具体产品类的依赖,提升系统扩展能力的。
2>差异
a.如果要增加新的产品类,简单工厂模式与抽象工厂模式都要修改工厂类代码,没有严格遵守“开闭原则”,而工厂方法模式没有这个问题,对扩展的支持更好。
b.简单工厂模式弊端较多,只适合在比较简单的环境中使用;工厂方法模式严格遵守“开闭原则”,适合在经常增加新产品的、对扩展要求比较高的环境中使用;抽象工厂模式适合在需要生产一系列相互关联的产品时使用。
...