Bootstrap

设计模式课程三:工厂模式之工厂方法

​ 在上一节中,我们知道 简单工厂模式 违背了开闭原则,扩展新的产品时需要修改工厂类。工厂方法模式对简单工厂做了进一步的抽象,使得产生新产品时不需要对原代码进行改动,满足开闭原则。

应用场景

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。比如宝马车工厂,奔驰车工厂

  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口

  • 客户不关心创建产品的细节,只关心产品的品牌

优点

  • 只需要知道具体工厂名就可得到所要的产品,无须关心产品的具体创建过程
  • 满足开闭原则,增加新产品时只需要创建一个对应的工厂类
  • 通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系

缺点

  • 类的个数容易增加到很多,复杂度增加
  • 一个工厂只能生成一种产品,可以使用 抽象工厂 来实现

类结构

在这里插入图片描述

Java实现示例

用工厂方法模式设计一个生成不同品牌车子的示例,可实现横向扩展新的品牌车而不用对原代码进行修改。

// 生成车工厂接口
public interface ICarFactory {

    /** 车的制造方法 */
    ICar create();
}

// 车的统一接口
public interface ICar {

    /**
     *  车子加油
     */
    void addOil();
}
// 第一个品牌,宝马车
public class BMWFactory implements ICarFactory {

    @Override
    public ICar create() {
        return new BMWCar();
    }
}

public class BMWCar implements ICar {

    @Override
    public void addOil() {
        System.out.println("BMW is adding oil..");
    }
}
// 第二个品牌,桑塔纳车(小船同学的座驾)
public class STNFactory implements ICarFactory {

    @Override
    public ICar create() {
        return new SangTaNa();
    }
}

public class SangTaNa implements ICar {

    @Override
    public void addOil() {
        System.out.println("SangTaNa is adding oil..");
    }
}
// 使用示例
public static void main(String[] args) {
    ICarFactory bmwFactory = new BMWFactory();
    ICarFactory stnFactory = new STNFactory();
    ICar bm = bmwFactory.create();
    ICar stn = stnFactory.create();
    bm.addOil();
    stn.addOil();
}

// 运行结果
BMW is adding oil..
SangTaNa is adding oil..

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;