在看下面讲解之前,最好还是先看下笔者的 简单工厂模式,因为我的例子,是有联系的;
目录
代码图解工厂方法模式优点缺点改进:工厂接口:
/** * 工厂接口,抽象出工厂具体的公有方法 */ interface Factory{ Produce factoryProduce(); }工厂实现类:
/** * 工厂实现类 */ class PianoFactory implements Factory{ @Override public Produce factoryProduce() { return new Piano(); } } class MotorcycleFactory implements Factory{ @Override public Produce factoryProduce() { return new Motorcycle(); } }测试类:
@Test public void Test(){ // 客户端需要制造一台钢琴 Factory factory = new PianoFactory(); Produce produce = factory.factoryProduce(); produce.method(); // 客户端制造一台摩托车 Factory factory1 = new MotorcycleFactory(); Produce produce1 = factory1.factoryProduce(); produce1.method(); }后期添加新的类(浴缸):
/** * 浴缸类 */ class Bathtub implements Produce { @Override public void method() { System.out.println("制造出一个浴缸"); } }浴缸工厂类:
class BathtubFactory implements Factory{ @Override public Produce factoryProduce() { return new Bathtub(); } }测试:
// 对于后期添加的浴缸,客户端不需要改动现有的代码 Factory factory2 = new BathtubFactory(); Produce produce2 = factory2.factoryProduce(); produce2.method();与 简单工厂模式 相比,工厂方法模式,更抽象一点,它把工厂也抽象出一个接口来;它让一个工厂只负责生产一种产品;
简单工厂模式 的优点,继续保持,还克服了 简单工厂模式 的缺点 ;
新增产品,不需要改动现有的代码当有新的产品需要添加进框架里面的时候,我们是不需要去改动现有的代码的;只需要写出对应的 产品类、工厂实现类;然后在API里面写上新增的产品即可 ;原有的 代码是一行都不需要改动的 ;
当 API 的设计者,新增新的产品的时候,设计者自己就蛋疼的很了,每一新增一个产品,他就需要对应的写一个工厂类,导致代码量剧增;
客户端在使用的时候,每次使用一个产品类的时候,都需要调用对应的工厂类,无形之中增加了系统的负担 ;
要克服上面的缺点,就需要使用 抽象工厂模式 了 ;
