【设计模式】--创建型模式总结

     学设计模式的时候总是学着后面的前面的就忘了,23个都学完了,但是个别几个有印象还是有很多都忘记了,问自己也问别人为什么会这样,明明学习每一个模式的时候也很认真啊,但是后来我知道自己为什么会这样了,因为我一直都是在孤立的在学每一个模式,而并没有把他们之间的联系找出来,也就是没有用好米老师所说的抓沙理论,給沙子添脚,所以,现在我只是想尝试看看自己能不能把这些设计模式都串起来。


一、简单工厂,工厂方法,抽象工厂

A服装厂最开始的时候只生产男装,叫做简单工厂。

B服装厂不仅生产男装还生产女装、童装等,叫做工厂方法。

C服装厂不仅仅生产衣服还生产帽子,围巾,鞋子等其他类型,叫做抽象工厂。

     简单工厂是需要什么向工厂发出需求就可以了,工厂给出你需要的东西,比如你需要男装,工厂,简单工厂就给你创建男装然后返回给你。工厂方法是如果你需要女装,先要告诉工厂,工厂把具体的创建女装的工作交给具体的子类去做,创建之后返回给你,这里的工厂是一个抽象角色,仅负责给出具体工厂类(男装类,女装类)必须实现的接口,不去做具体创建的细节。抽象工厂是把工厂方法中的接口由一个扩展为多个。比如,刚刚我们的工厂方法只有一个接口,可以实现男装和女装两个子类,现在抽象工厂就是可以有很多个接口。服装类接口,帽子类接口,鞋子类接口等等。每个接口下面可以实现多个具体的产品分类。 


二、工厂方法和模板方法模式

     为了体现出这些模式之间的联系,我们还以上面的例子为索引。

工厂方法:B服装厂生产男装和女装,他们有一个统一的接口,就是这个抽象服装厂类。

模板方法:B服装厂生产男装和女装,做服装的方法大概流程是差不多的,但是具体生成男装和女装的方法可能不一样。所以我们需要一个做服装的抽象方法,然后分别实例化出做男装女装不同的具体方法。

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。我理解的模板方法和工厂方法之间的关系就在于:只要用模板方法的时候其实就用到了工厂方法。

小结:创建型设计模式是从工厂方法开始的,当设计者发现需要更大灵活性时,设计便会向创建型模式演化。当设计者在设计标准之间权衡的时候,了解多个创建型模式可以给设计者更多的选择余地。

 

三、PROTOTYPE原型模式

      大家一定都经历过过年的时候短信发祝福的情况,我们用满满的爱心写了一封短信,但是我们还要写第二封,第三封……每封短信都相当于创建了一个“祝福短信”对象,这个时候我们可以克隆第一封祝福短信作为第二封,第三封……发送给大家。所以呢,在这种情况下,建立相应数目的原型并克隆他们比每次都手工重新实例化要方便的多。

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

 

四、原型与抽象工厂的关系:

     先来看看抽象工厂的缺点吧,

     举个例子:现在人种有三个抽象类:分为黄种人,白种人,黑种人,每个抽象类下面都有两个实现类,男性类,女性类。如果我们想要增加一个人种—蓝种人,也就是产品家族增加了,我们的程序会做出怎样的改动呢?首先,抽象类HumanFactory要增加一个方法createBlueHuman(),然后,两个实现类FemaleFactory和MaleFactory也要修改,如果在项目开发中,一定是很麻烦的,因为严重的违反了开闭原则,而且我们一直说抽象类和接口是一个契约,一旦改变契约,所有与契约有关系的代码都要修改。

     但是如果我们加入原型模式会怎样呢?

     如果要增加一个人种,只需要克隆一个已有对象,然后在上面修改变便得到自己想要的对象。而且原型模式是克隆的对象,比直接new一个对象的性能会更好,因为每次实例化创建新对象的过程其实是很耗费内存的。

     从相似的角度来说,它们两个都通过Composite的方式,把实例化的过程从具体使用这些对象的类中分离出去,只让用户知道调用Manager或Factory的哪些方法来实例化而不用记住具体的类名。抽象工厂和原型模式是基于相同原理的模式,唯一的不同之处就是实例化的过程,抽象工厂是基于new来实例化对象的(缺点是HardCode,编译时已经决定了要实例化的具体是什么对象),而原型是基于Clone来创建对象的(优点是在程序运行时,能够像策略模式一样实时更换对象,创建出基于相同接口的不同对象。)

 

五、BUILDER  建造者模式

     和陌生人初次见面的时候一般都要说“你好!”见到不同地方的陌生人,如果我们可以用他们本地和方言和他们说“你好!”是不是会亲近许多呢~~如果我们有一个翻译机,里面事先存好了各种地方的“你好!”的方言。当见到来自不同地方的陌生人,我们只要按下对应的键就能够用当地方言说出“你好!”,这就是“你好!”的builder。这个builder将“你好!”的创建和他的表示分离,让同样的一句“你好”可以有不同的表示。优点在哪呢?—→Builder完美的将创造过程隐藏,只需一个按键,一个完美的当地“你好!”就创建出来了,在高内聚前提下使得与外界的耦合度大大的降低了。

     建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

这个模式还没有找到和其他创建型模式之间的关系,之后再从联系上作总结。


感谢您的阅读,未完待续。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值