工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
使用场景:业务方面:在处理奖惩、订单、押金、保险的流水时,不同的类型单独处理;
通用业务:日志记录,日志记录到本地还是远程服务器;数据库访问;
一、简单工厂
实现:根据创建接口传入的类型来选择返回的创建对象
成员:产品接口类(或抽象类)、产品实现类、工厂类
缺点:新增一种实现类需要再工厂类中添加判断,违背开闭原则
/** * 简单工厂模式 * 根据参数code来选择对应的产品 * 新增一种产品需要添加判断,更改工厂内的方法 * 违背开闭原则 * Created by wanghh on 2018-8-23. */ public class SimpleFactory { public static AbstractProdtctService createProductService(Integer code) { if (code == null) { return null; } switch (code) { case 1: return SpringContextFactory.getBean(AProdtctServiceImpl.class); case 2: return SpringContextFactory.getBean(BProdtctServiceImpl.class); case 3: return SpringContextFactory.getBean(CProdtctServiceImpl.class); default: return SpringContextFactory.getBean(AProdtctServiceImpl.class); } } }
二、工厂方法
实现:将简单工厂类SimpleFactory拆分为抽象工厂类和具体工厂类,创建对象在具体工厂类中,其决定具体实例化的对象
成员:抽象产品接口类(或抽象类)、具体产品类、抽象工厂、具体工厂
优点:克服简单工厂违背的开闭原则,当新增一个产品时,只要新增一个具体工厂类即可
缺点:系统中类的个数将成对增加,在一定程度上增加了系统的复杂度
/** * 工厂方法 * 创建对象的操作延迟到具体工厂里实现 * 新增一种产品,只需新增一种具体工厂 */ public interface AbstractFactory { ProdtctService createProductService(); } /** * A具体工厂 */ public class AFactory implements AbstractFactory{ @Override public ProdtctService createProductService() { return new AProdtctServiceImpl(); } } /** * B具体工厂 */ public class BFactory implements AbstractFactory{ @Override public ProdtctService createProductService() { return new BProdtctServiceImpl(); } } /** * C具体工厂 */ public class CFactory implements AbstractFactory{ @Override public ProdtctService createProductService() { return new CProdtctServiceImpl(); } }
三、抽象工厂
抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
成员:抽象工厂、具体工厂1、具体工厂2、抽象产品A、抽象产品B、具体产品A1、具体产品A2、具体产品B1、具体产品B2
场景:系统的产品多于一个产品族,而系统只消费某一族的产品。
缺点:类个数较多,程序复杂性增加,新增一种产品,需要更改多个类