对于工厂模式三姐妹,大家想必都已经烂熟于心了。不过,虽然设计模式看了一半多了,对于它的一部分思想还是有些困惑。没办法,写总结吧!
工厂三姐妹是指简单工厂模式、工厂方法模式和抽象工厂模式。下面我们再来重新认识一下他们吧!
(一)简单工厂模式。
定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常是有共同的父类或者接口。
组成:
(1)Creator(工厂类):是简单工厂模式的核心,它负责创建所有具体产品类的实例。可以被外界调用创建所需的产品对象。
(2)Product(抽象产品类):所有具体产品角色的父类,它描述所有实例的共有的接口。
(3)Concrete Product(具体产品类):继承Product,是此模式的创建目标。工厂类返回的都是某一具体产品。
类图:
优点:通过使用工厂类,决定创建哪个具体类的对象。明确了各自职责。
缺点:违反了高内聚责任分配原则(所有实例创建都集中于工厂类)。违反了开放封闭原则(功能拓展时,需要修改工厂类)。
使用场景:(1)工厂类创建的对象较少;
(2)客户只需知道传入参数,不必关心如何创建之时。
(二)工厂方法模式。
定义:工厂方法模式是定义一个创建产品抽象的工厂接口,将实际创建工作推迟到子类当中。
组成:
(1)抽象工厂角色:工厂方法模式的核心。创建对象的工厂类必须实现此接口。
(2)具体工厂角色:实现抽象工厂接口(角色)的具体工厂类。创建产品对象。
(3)抽象产品角色:有不同的实现。
(4)具体产品角色:实现抽象产品角色定义的接口。
类图:
优点:(1)用户只需知道产品的具体工厂,无需知道创建过程
(2)很好的符合了开放封闭原则。在添加新产品时,只需要添加代码即可。
缺点:每增加一个产品,都要增加一个具体类和相应工厂,使系统复杂程度增大。
适用场景:(1)对于某个产品,调用者知道具体工厂并实例化,生产具体产品。
(2)只需要一种产品,最终的具体工厂由生产者决定。
(三)抽象工厂模式。
定义:提供一个创建一系列相关或互相依赖对象的接口,无需指定它们具体的类。
组成:
(1)抽象工厂角色:包含所有产品创建的抽象方法。
(2)具体工厂角色:创建具有特定实现的产品对象。
(3)抽象产品角色:有不同的实现。
(4)具体产品角色:对抽象产品的具体实现。
类图:
优点:(1)隔离了具体类的创建。
(2)符合开放封闭原则。增加产品类时十分方便。
缺点:增加新的产品等级结构时,需要修改工厂,不支持“开放封闭原则”。
简单工厂PK工厂方法
结构上,简单工厂是所有的产品都在一个工厂中生产。工厂方法模式不同产品各有一个工厂。这就决定了简单工厂模式的缺点可以在工厂方法模式中得到改善。
工厂方法PK抽象工厂
工厂方法只有一个抽象产品类,并且具体工厂类只能创建一个具体产品类。抽象工厂则有多个抽象产品类,并且具体工厂类可以创建多个具体产品类。
这三种模式各有各的优缺点。他们的结构越来越复杂,功能也越来越强大。扩展性和解耦能力也是越来越强。但是也不能说抽象工厂模式就是最好的。还要根据自己的情景来选择最合适的!