作用:
实现创建者与调用者的分离,
实例化对象不使用new,用工厂方法代替,将调用者跟实现类解耦,调用者只需要给方法提供实例的抽象,而不需要关心实例具体是如何创建的,创建实例的具体细节由工厂类实现
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
简单工厂模式(静态工厂模式)
一个工厂可以创建多种实例,只需要通过创建方法传参(Class对象或者约定的字符串)
优点简单
缺点实现不好违背开闭原则
可以通过反射满足开闭原则
class ProductFactory{public static IProduct getProduct(Class<? extends IProduct> clazz){try{if(clazz!=null){return clazz.newInstance();}}catch(Exception e){e.printStackTrace();}return null;}}
工厂方法模式(多态性工厂模式)
每一种实例都配置一个专属的工厂,一个工厂只能创建一种实例
定义一个创建对象的接口,但由实现这个接口的类来决定实例化哪个类,工厂方法把类的实例化推迟到子类中进行。
优点:符合开闭原则
缺点:类膨胀
public interface IFactory {IProduct getProduct();static class MethodFactoryA implements IFactory {@Overridepublic IProduct getProduct() {return new ProductA();}}static class MethodFactoryB implements IFactory {@Overridepublic IProduct getProduct() {return new ProductB();}}}
需要先实例化工厂,然后通过工厂对象创建对象
工厂方法模式的缺点
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
工厂方法模式的缺点
- 类的个数容易过多,增加复杂度。
- 增加了系统的抽象性和理解难度。
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)指提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。意思是客户端不必指定产品的具体类型,创建多个产品族中的产品对象。
一个工厂生产一个产品族的产品
与工厂方法模式相比:
- 工厂方法模式一个工厂只生产一类产品,而抽象工厂模式可以生产多中产品(产品族)
- 抽象工厂模式横向扩展容易(新增产品族),符合开闭原则;纵向扩展困难(在产品族中增加新的产品),不符合开闭原则
工厂方法模式完全符合开闭原则
Spring的BeanFactory使用抽象工厂模式
