目录
简单工厂模式(Simple Factory Pattern)
工厂方法模式(Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
前言
为了使得软件的结构更加清晰,外界对于这些对象使用只需要知道共同的接口,而不在意具体实现的细节,这样使得整个系统更加符合单一职责的原则。创建型模式隐藏了类的实例的创建细节,通过隐藏对象创建和组合过程从而使得整个系统相互独立的目的。
工厂模式是一个重要的创建型模式,主要功能就是实例化对象。
创建型模式:对类的实例化过程进行抽象,能够将对象的创建和对象的使用分离开来。
工厂模式总述
工厂模式是一种创建型模式,提供了创建对象的最佳方式。
使用工厂模式创建对象不会对客户端暴露创建逻辑,并且使用一个共同的接口来指向新创建的对象,用于在不同的条件下需要创建不同的实例时使用
工厂模式的分类:
- 简单工厂模式Simple Factory
- 工厂方法模式Factory Method
- 抽象工厂模式Abstract Factory
工厂模式优点:
- 可以使得代码结构清晰,有效地封装变化
- 对调用者屏蔽具体的产品类
- 降低代码的耦合度
工厂模式的使用场景:
- 在任何需要生成复杂对象的地方,都可以使用工厂方法模式.只有复杂的对象才适用于工厂方法模式.对于简单的只要通过new就可以完成创建的对象,无需使用工厂模式.如果简单对象使用工厂模式,需要引入一个工厂类,增加系统的复杂度
- 工厂模式是一种典型的解耦模式,当类之间需要增加依赖关系时,可以使用工厂模式降低系统之间的耦合度
- 工厂模式是依靠抽象架构的,将实例化的任务交给子类实现,扩展性好.当系统需要较好的扩展性时,可以使用工厂模式,不同的产品使用不同的工厂来实现组装
简单工厂模式(Simple Factory Pattern)
定义一个类用于负责创建其余类的实例,根据自变量的不同,返回不同类的实例。被创建的实例通常都有一个共同的父类。简单工厂模式中用于创建实例的方法时静态static方法,因此又称作是静态工厂方法模式。
简单工厂模式代码实现
工厂方法模式(Factory Method Pattern)
定义一个创建对象的接口,通过实现这个接口的类来决定实例化具体的类,工厂方法模式让具体的类的实例化延迟到子类中进行
工厂模式代码实现
工厂方法模式总结
- 工厂方法模式是简单工厂模式的抽象和拓展,通过多态,工厂方法模式保持了简单工厂模式的优点,改善了简单工厂模式的缺点
- 工厂方法模式中,核心的工厂类仅仅给出具体工厂实现必须实现的接口,不再负责具体产品的创建,具体产品的创建交由具体的工厂实现完成.这样使得系统可以在不修改核心的工厂类时进行具体产品实现的扩展。
- 优点:
- 客户端想要创建对象,只需要知道具体工厂实现即可
- 系统的扩展性高,如果新增产品,只需要一个具体工厂实现类和具体产品类即可,符合开闭原则
- 对客户端隐藏了具体实现,客户端只需要关心具体的工厂实现即可
- 缺点:
- 每次增加一个产品,都需要增加一个具体工厂实现类和具体产品类,这样使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,也增加了系统具体类的依赖,同时类的增加也增加了编译和运行时的系统开销
抽象工厂模式(Abstract Factory Pattern)
提供接口或者抽象类用于创建一组相关或者相互依赖的具体产品对象,不需要指定具体的类。
抽象工厂模式与工厂方法模式区别:
- 抽象工厂模式:
- 抽象工厂模式是针对多个产品的等级结构
- 抽象工厂模式的具体产品实现或者继承于不同的接口或者抽象类
- 工厂方法模式:
- 工厂方法模式是针对一个产品的等级结构
- 工厂方法模式的具体产品实现或者继承于同一个接口或者抽象类
抽象工厂模式的角色:
- 抽象工厂类AbstractFactory: 抽象工厂模式的核心,与应用的业务逻辑无关. 通常使用接口或者抽象类实现,所有具体工厂类ConcreteFactory必须实现接口或者抽象类
- 具体工厂类ConcreteFactory: 实现工厂定义的方法,包含创建具体产品实例的业务逻辑
- 抽象产品AbstractProduct: 定义一类产品对象的接口或者抽象类,这个类是工厂方法模式创建的对象的父类
- 具体产品ConcreteProduct: 实现业务逻辑的具体的产品,抽象工厂中创建的每一个产品对象都是一个具体产品的实例
抽象工厂模式代码实现
抽象工厂模式优点&缺点:
抽象工厂模式优点:
- 抽象工厂模式分隔了具体类的生成,客户端不需要知道具体创建的类
- 当一个产品族中的对象设计成一起工作时,能够保证客户端只使用同一个产品族的对象
抽象工厂模式缺点:
- 如果添加新的产品对象时,难以对产品等级结构进行扩展
抽象工厂模式总结
- 抽象工厂模式是工厂方法模式的进一步拓展,提供了更为强大的工厂类用于系统的扩展。
- 抽象工厂模式分隔了具体类的生成,客户端无需了解产品的创建过程,这样使得很容易切换具体工厂.因为所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以改变整个系统的行为
- 当一个产品族中的多个产品对象一起工作时,可以保证客户端始终只使用同一个产品族中的对象
- 增加新的产品很方便,无需修改已有的系统,符合开闭原则
- 但是增加系统新的产品族的产品等级结构很麻烦,需要对原有的系统大量修改,甚至需要修改抽象层代码,违背了开闭原则