设计模式——简单工厂

《Head First 设计模式》 学习笔记,码云同步更新中

如有错误或不足之处,请一定指出,谢谢~

目录

查看其它设计模式笔记,点这里→设计模式笔记汇总

简单工厂

  • 定义:
    • 定义一个类来专门负责创建其他类的实例,被创建的实例通常具有共同的父类。
      简单工厂可以根据参数的不同返回一个相应的实例
    • 严格来讲,简单工厂模式不属于设计模式,而是属于一种编程习惯
  • 结构:
    • Factory:工厂角色
    • Product:抽象产品
    • ConcreteProduct:具体产品
  • 优点:
    • 简单工厂实现了责任的分隔,客户端免除了创建产品对象的责任。
    • 客户端无需知道对象创建细节,只需要知道什么参数对应什么对象即可。
    • 通过配置文件,可以在不修改客户端代码的情况下更换、增加新的产品类,提高了灵活性。
  • 缺点:
    • 工厂类集中了所有产品的创建逻辑,一旦无法正常工作,整个系统都会受影响
    • 扩展困难。增加修改产品类都需要修改工厂类。如果产品类数量过多,工厂类会很难维护。
    • 工厂方法一般都是静态的,工厂无法进行继承。
  • 使用环境:
    • 工厂类需要创建的对象数量比较少
    • 客户端不关心独享创建细节,只知道参数。
  • 案例:
    • 披萨店。顾客点单时,需要根据菜名创建出各种不同种类的披萨。
      这些披萨都源自同一个披萨基类,不过各自有自己的口味实现。
      而我们创建具体的披萨对象时,只需要提供名字,不需要知道它们是如何创建的。
      这时就可以用到简单工厂,传递一个参数给工厂类,返回一个相应的披萨对象。
  • 代码:
/**
 * 披萨超类
 **/
public interface Pizza {
    /**
     * 准备
     */
    void prepare();

    /**
     * 烘焙
     */
    void bake();

    /**
     * 切片
     */
    void cut();

    /**
     * 装盒
     */
    void box();
}

/**
 * 芝士披萨
 **/
public class CheesePizza implements Pizza {

    @Override
    public void prepare() {
    }

    @Override
    public void bake() {
    }

    @Override
    public void cut() {
    }

    @Override
    public void box() {
        System.out.println("芝士披萨完成...");
    }
}

// 其他披萨略...

/**
 * 披萨简单工厂
 **/
public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if ("cheese".equals(type)) {
            pizza = new CheesePizza();
        } else if ("veggie".equals(type)) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}

/**
 * 披萨店
 **/
public class PizzaStore {

    private SimplePizzaFactory pizzaFactory;

    public PizzaStore(SimplePizzaFactory pizzaFactory) {
        this.pizzaFactory = pizzaFactory;
    }

    /**
     * 点单
     **/
    public Pizza orderPizza(String type) {

        // Pizza pizza = new Pizza();  // 用简单工厂改造
        Pizza pizza = pizzaFactory.createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

/**
 * 测试类
 **/
public class Test {
    public static void main(String[] args) {
        PizzaStore pizzaStore = new PizzaStore(new SimplePizzaFactory());
        pizzaStore.orderPizza("cheese");
    }
}

结果:
    芝士披萨完成...
  • 参考资料:
    • 图说设计模式——简单工厂模式

你可能感兴趣的:(设计模式——简单工厂)