美文网首页
设计模式——简单工厂

设计模式——简单工厂

作者: prik丶 | 来源:发表于2019-07-26 14:43 被阅读0次

    《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");
        }
    }
    
    结果:
        芝士披萨完成...
    

    相关文章

      网友评论

          本文标题:设计模式——简单工厂

          本文链接:https://www.haomeiwen.com/subject/ojtdrctx.html