引言
工厂模式为创建对象提供接口,分为简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory),这几个模式的抽象性依次递增。
细化
- 简单工厂模式:
①简介:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。它是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式中最简单实用的模式,他有一个专门的类来负责创建实例的过程(负责生产对象的一个类),当代码使用大量具体类时,一旦加入新的具体类,则必须改代码,违反了开放-封闭原则。
②角色:
工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
③应用环境:
(1)编码时不能预见创建哪种类实例
(2)系统不依赖于产品类实例如何被创建、组合和表达的细节
④优缺点:
优点(可以解决的问题):
(1) 解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任
(2) 起到了代码复用的作用
缺点:
(1) 不易扩展
(2) 耦合度太大
⑤结构图:
工厂方法模式:
①简介:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类;在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
②角色:
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
④优缺点:
优点:允许系统在不修改具体工厂角色的情况下引进新产品,例如:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量,例如:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。
⑤结构图:
抽象工厂模式:
①简介:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
②使用抽象工厂模式的条件:
(1) 系统中有多个产品族,而系统一次只可能消费其中一族产品
(2)同属于同一个产品族的产品以其使用。
③角色:
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由具体的类来实现。
⑤结构图:
比较三种模式的异同:
工厂方法模式:① 一个抽象产品类,可以派生出多个具体产品类。
② 一个抽象工厂类,可以派生出多个具体工厂类。
③ 每个具体工厂类只能创建一个具体产品类的实例。
④支持扩展,增加产品
抽象工厂模式:① 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
② 一个抽象工厂类,可以派生出多个具体工厂类。
③ 每个具体工厂类可以创建多个具体产品类的实例。
④ 不支持扩展增加产品,支持增加产品族
区别:① 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
② 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂注意事项:
(1)工厂类常常采用单例模式(Singleton)。
(2)工厂类拥有基类(定义共同接口),基类可以为纯虚类,也可以定义缺省方法。
(3)对于工厂方法和抽象工厂,基类中的生产产品的函数常常为虚函数,以实现动态绑定。
(4)调用工厂方法的函数通常采用工厂实现的指针和引用作为形参,以便根据不同的工厂实参调用不同的工厂方法。
小结
感觉这几个模式之间有很多的联系,所以对他们进行了归类总结,文中对这几种图的使用环境和特点进行了一定的讲解,自己只能理解到这个程度,或许还不是很全面,有待补充的地方,欢迎大家多多交流,提出宝贵的意见和建议!!!