一、定义
工厂方法模式是简单工厂的进一步深化,在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品,而是针对不同的产品提供不同的工厂。也就是说每个产品都有一个与之对应的工厂。 定义一个创建产品的接口(工厂接口),让实现这个接口的类来决定实例化那个类,让类的实例化推迟到实现这个接口的子类中。
Product抽象产品类:负责定义产品的共性。
Creator抽象工厂类:负责定义工厂的共性。
ConcreateProcuct:具体的产品实现类。
ConcreateCreator:具体的工厂实现类,负责创建产品。
二、类型
创建型
三、适用场景
- 客户端不需要知道它所依赖的产品类是如何创建的。
- 客户端可以通过指定工厂类的子类来创建对应的对象。
四、优点
- 客户端只需要知道产品对应的工厂,无需关心其创建细节。
- 加入新产品只需要实现对应的工厂,符合开闭原则。
五、缺点
类的个数容易过多,增加了系统的复杂度。
六、类图
七、代码实现
产品接口:
package com.wms.factory; public interface Fruit { void produce(); }
产品实现类:
package com.wms.factory; public class Banana implements Fruit { public void produce() { System.out.println("生产香蕉"); } }
package com.wms.factory; public class Apple implements Fruit { public void produce() { System.out.println("生产苹果"); } }
工厂接口:
package com.wms.factory; public interface Factory { Fruit getFruit(); }
工厂实现类:
package com.wms.factory; public class AppleFactory implements Factory { public Fruit getFruit() { return new Apple(); } }
package com.wms.factory; public class BananaFactory implements Factory { public Fruit getFruit() { return new Banana(); } }
客户端:
package com.wms.factory; public class TestDesignPattern { public static void main(String[] args) { Factory appleFactory = new AppleFactory(); Fruit apple = appleFactory.getFruit(); apple.produce(); Factory bananaFactory = new BananaFactory(); Fruit banana = bananaFactory.getFruit(); banana.produce(); } }
八、JDK或开源框架中实现
JDK: