《Head First 设计格局》 读书笔记0四 工厂格局(一)

《Head First 设计格局》 读书笔记0四 工厂格局(一)

正文源自深远浅出设计情势. 只但是作者是使用C#/.NET Core实现的例子.

正文的概念性内容出自深切浅出设计格局1书.

《Head First 设计格局》读书笔记0肆 工厂情势

一 工厂方法情势#

大家用做披萨来比喻。工厂方法情势由creator,product五个大类组成,分别代表pizzaStore和pizza。通过1个orderPizza方法和三个工厂方法联合起来,就足以形成叁个框架。工厂方法将生育知识封装进各种创造者。

 

上1篇小说讲了简便易行工厂和工厂方法设计方式
, 使用的是披萨店的例子.

 

一、具体的店##


以创造London韵味披萨子类为例

  • 落成持续自PizzaStore抽象类的实际子类,为London韵味的披萨(NYStylePizzaStore)
  • 具体子类落成createPizza方法,担当再次回到二个Pizza对象,由子类全权肩负发生哪些具体pizza
  • 继承自超类的orderpizza方法并不知道那一个pizza是由哪个子类发生的,不过它通晓pizza能够被烘焙,切成块等等公共操作。

同一的,别的风味的披萨具体子类,也是那样成立

前言

当您瞧瞧new那些主要字的时候, 就相应想到它是切实可行的落成.

澳门新萄京 1

那就是二个切实可行的类, 为了更加灵活, 大家应当使用的是接口(interface).

神跡, 你也许会写出那样的代码:

澳门新萄京 2

此地有多个具体的类被实例化了, 是凭仗分歧意况在运作时被实例化的. 

当您看到这么的代码, 你就能知晓当有供给供给对其开始展览改造也许扩展的时候,
你就得把那个文件展开, 然后看看在此间应该加上或许去除点什么.
那类的代码平时会散开在程序的四个地点,
那维护和换代起来就很麻烦而且轻松出错.

针对interface实行编制程序的时候,
你领会能够把本人独立于系统今后也许要发出的变化. 为何吗?
因为只要您针对interface编制程序,
那么对于任何实现了该接口的具体类对您来讲都足以用, 多态吗.

文将承继使用那几个事例, 这里要用到虚幻工厂.

难点的提议

  怎么样将实例化具体类的代码从使用中抽离,或许封装起来,使它们不会侵扰应用的别样一些?

  假诺你有一个披萨店,那么代码最初大概是那般:

澳门新萄京 3澳门新萄京 4初期的披萨店代码

Pizza oderPizza(String type)
{
    //Pizza是一个接口
    Pizza pizza;

    //随着时间改变的地方
    if(type.equals("cheese"))
    {
        pizza = new CheesePizza();
    }
    else if(type.equals("greel"))
    {
        pizza = new GreekPizza();
    }
    else if(type.equals("pepperoni"))
    {
        pizza = new PepperoniPizza();
    }

    //不改变的地方
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
}

 

  披萨类型大概随着时间各个变动,那么找到了改动的有个别和不改变的某个之后,使用封装将成立对象的有的移到外围去。

  卷入创立对象的代码

  澳门新萄京 5

 

澳门新萄京,二、申美赞臣个工厂方法##


申明工厂方法,并将以此法子传入orderpizza方法中。

protected abstract Pizza CreatePizza(String type)
orederPizza(){
Pizza pizza;
pizza = createPizza;
...
}

工厂方法广泛公式:abstract Product factoryMethod(String type)。

类型本来必要

有三个前方的披萨店, 做披萨, 上面是订购披萨的类:

澳门新萄京 6

new2个披萨, 然后依照工序进行加工 最终回到披萨.

不过, 一个披萨店不容许唯有1种披萨, 恐怕会有那叁当中披萨,
所以你可能会这么修改代码:

澳门新萄京 7

依照传入的花色, 成立分化的披萨, 然后加工再次回到.

接下来难点来了, 随着时间的推迟,
一个披萨店会淘汰不火热的披萨并加多新类型披萨.

运用方面包车型客车代码就能产出那几个标题, 针对供给变动,
小编只可以把OrderPizza的一对代码改来改去:

澳门新萄京 8

从此间, 大家也能够看到, 上半有的是会变动的片段, 下半局地是不改变的片段,
所以它们应该分别(把调换的1部分和不改变的1对分离, 然后实行李包裹装).

组织应当是这么的:

澳门新萄京 9

右上角是变化的片段, 把那某个装进到二个目的里, 它就是用来创建披萨的对象,
大家把那个目的叫做: 工厂.

工厂负担创立对象的细节专门的学业. 大家创设的那几个工厂叫做SimplePizzaFactory,
而orderPizza()这一个主意就是该工厂的一个客户(client).

别的时候客户供给披萨的时候, 披萨工厂就能够给客户创制贰个披萨.

接下去, 我们就成立那么些大约的披萨工厂:

澳门新萄京 10

尽管通过传播的门类参数, 创设并回到分歧类型的披萨.

如此大家就把披萨创立的行事封装到了三个类里面, 发生变化的时候,
只要求修改那一个类就能够.

只顾: 有时候上边那种简易工厂能够使用静态方法, 不过那样也有瑕疵,
正是不也许透过持续来扩张那些工厂了.

回去修改PizzaStore那个类:

澳门新萄京 11

工厂是从构造函数传入的, 并在PizzaStore里面保留3个引用.

在OrderPizza()方法里面, 我们使用工厂的始建方法取代了new关键字,
所以在这里未有实际的实例化.

披萨店的供给变动

于今披萨店在随地授权了大多有关分店, 但是有个别子集团偷工减料,
使用劣质原料庖代标准原料.

披萨店COO今后即便想减轻这一个难题.

 

三、怎样点披萨呢?##


创办一个你要的气韵的披萨店,调用orderPizza方法,传入你相关的配料参数(配置)就好了。
orderPizza不掌握管理的是怎么着披萨,但是它正是进展统①的切成片装盘。

披萨

PizzaStore nyPizzaStore = new NYPIzzaStore();
nyPizzaStore.orderPizza("cheese");
//在orderPizza中久调用了createPizza方法
Pizza pizza = createPizza("cheese");

披萨店部分产生,披萨本人吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图