大白话工厂方法模式(Factory Method)

简单工厂模式缺陷

大白话简单工厂模式(Simple Factory Pattern)中经过买车的经历解释了简单工厂模式。但熟悉设计模式的朋友会发现一些问题。java

  • 工厂类集中了全部实例(产品)的建立逻辑,一旦这个工厂不能正常工做,整个系统都会受到影响。用日产车工厂的例子来形容就是日产汽车的工厂负责全部车型的制造,当发生停电、火灾等状况时,汽车没法正常制造,大大影响汽车的销售,使企业陷入困境
  • 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会形成工厂逻辑过于复杂。这句话的意思是当企业发布新产品,该工厂须要从新学习新车型的制造,加大工人压力。

因此,随着企业的发展,日产公司决定将每种车型进行分工厂制造,解决了上述问题。这种方法在设计模式中被称为工厂方法模式设计模式

简单工厂模式改造

下面咱们从代码的角度进行分析。4S店卖车首先要有车,这里只取日产部分车型逍客,轩逸和天籁。
代码片断1 日产车父类,全部车型都继承此类。ide

/**
 * 日产车
 * @author coderzcr
 */
abstract class NissanCar {
    String name;
    void printCar(){
        System.out.println(name+"汽车已制造完成");
    }
}

代码片断2 车型:逍客学习

/**
 * 车型:逍客
 * @author coderzcr
 */
class Xtrail extends NissanCar {
    Xtrail(){
        this.name = "逍客";
    }
}

代码片断3 车型:轩逸this

/**
 * 车型:轩逸
 * @author coderzcr
 */
class Sylphy extends NissanCar {
    Sylphy(){
        this.name = "轩逸";
    }
}

代码片断4 车型:天籁设计

/**
 * 车型:天籁
 * @author coderzcr
 */
class Altima extends NissanCar {
    Altima(){
        this.name="天籁";
    }
}

有了具体的车型要求,咱们须要对不一样车型创建工厂。
代码片断5 日产工厂父类,全部工厂都继承此类。code

/**
 * 日产车工厂
 * @author coderzcr
 */
public abstract class NissanCarFactory {
    /**
     * 生产汽车
     */
    abstract NissanCar createCar() ;

}

代码片断6 天籁工厂。htm

/**
 * 天籁工厂
 * @author coderzcr
 */
public class AltimaFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Altima();
    }
}

代码片断7 逍客工厂。对象

/**
 * 逍客工厂
 * @author coderzcr
 */
public class XtrailFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Xtrail();
    }
}

代码片断8 轩逸工厂。

/**
 * 轩逸工厂
 * @author coderzcr
 */
public class SylphyFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Sylphy();
    }
}

图1 多工厂类图
多工厂类图

工厂方法模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类建立型模式。在工厂方法模式中,工厂父类负责定义建立产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样作的目的是将产品类的实例化操做延迟到工厂子类中完成,即经过工厂子类来肯定究竟应该实例化哪个具体产品类。

工厂父类(日产车工厂)
工厂子类(轩逸工厂、天籁工厂、逍客工厂)
即产品的制造分配给子工厂,缓解单一工厂的压力。

工厂方法模式结构

图2 工厂方法模式结构
工厂方法模式结构

工厂方法模式包含以下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

工厂方法模式分析

优势分析

  • 工厂方法模式的优势包括简单工厂方法模式的优势:用户只须要关心所需产品对应的工厂,无须关心建立细节,甚至无须知道具体产品类的类名。
  • 并且解决了简单工厂存在的不符合开闭原则问题,
    在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其余的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就能够了。这样,系统的可扩展性也就变得很是好,彻底符合“开闭原则”。

缺点分析

添加新产品时,须要添加一个具体工厂和具体产品,在必定程度上增长了系统的复杂度,有更多的类须要编译和运行,会给系统带来一些额外的开销。

参考文献

2. 工厂方法模式(Factory Method Pattern) — Graphic Design Patterns

相关文章
相关标签/搜索