码迷,mamicode.com
首页 > 其他好文 > 详细

工厂模式

时间:2019-05-11 23:35:46      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:ast   a*   第一步   abstract   有一个   tor   工厂方法   new   equal   

工厂模式:  应该有三类, 让我们循序渐进, 利用工厂模式来开一个pizza店

  工厂模式是用来解决new 的问题. 当你new出一个对象的时候你想到的是什么? 想到的是"具体", 实在实例化一个具体类, 用的是实现, 而不是接口, 代码绑定具体类会让代码更脆弱,更缺乏弹性. --->针对接口编程, 可以隔离掉以后系统可能发生的一大堆改变;    为什么呢? 如果是针对接口写的, 可以通过多态, 它可以与任何新类实现该接口;

第一步: 简单工厂方法---> 就一个pizza店嘛, 然后从pizza工厂取pizza, 然后按照流程制作pizza

public class PizzaStore {

    public Pizza orderPizza() {
        Pizza pizza = new PizzaFactory().createPizza("chessPizza");

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

    }
}

public class PizzaFactory {
  /*传进来什么类型的pizza, 就返回什么类型的pizza/
    public Pizza createPizza(String style) {
        Pizza pizza = null;
        if (style.equals("chessPizza")) {
            return new ChessPizza();
        } else if (style.equals("seaFoodPizza")){
            return new SeaFoodPizza();
        }
        return pizza;
    }
}

那么这里肯定有疑问了, 你不就把new 具体pizza的代码换了个地方吗? -----> 哈哈, 别忘了, 除了你这里可以用这个工厂, 其他地方也可以用这个工厂, 而且把所有的pizza对象都统一到工厂对象来管理了. 当然还有静态工厂, 静态工厂不能通过继承来改变创建对象的方法(缺点吧);

OK,到这里你已经成功开启了一家pizza店, 而且你也不需要自己生产pizaa,想要哪种类型的pizza问pizzaFactory要就行了.

 2. 随着你的加盟店的扩大, 有newyork加盟店, chigaco加盟店, 不同的地区有不同口味的pizza, 当然可以给每个地区加盟店都配备一个自己专属工厂. 

  但你发现这些加盟店虽然用了你的工厂获取pizza对象, 可加工pizza的方式却不尽相同,为了统一pizza的加工流程, (希望把加盟店和创建pizza捆绑在一起的同时又使代码有一定的弹性), 该工厂方法出马了;

 

public abstract class PizzaStore {
/*加盟点都来继承这个抽象的pizzaStore, 那么他们既可以随自己生产pizza, 又可以按照统一的流程加工pizza*/
    public Pizza orderPizza(String type) {
        Pizza pizza;

        pizza = createPizza(type);

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

    }
  /*将创建pizza的方法不再独立交给工厂, 而是抽象出来, 让子类去决定产生什么类型的pizza*/
    protected abstract Pizza createPizza(String type);
}

 

3.还有一个抽象工厂模式, 想象一下, 在pizza的prepare阶段, 使用不同的配料, 当然不能自己去new, 而是利用工厂方法, 让子类去判断用什么配料, 而这一套配料(其实就是一家族的对象), 可以交给配料工厂来生产-------->简单工厂 + 工厂方法 -----> 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类; 自己去感受吧

 

 

 

工厂模式

标签:ast   a*   第一步   abstract   有一个   tor   工厂方法   new   equal   

原文地址:https://www.cnblogs.com/noino/p/10817393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!