大话设计模式之三世同堂

工厂,又称制造厂,是一类用以生产货物的大型工业建筑物。大部分工厂都拥有以大型机器或设备构成的生产线。在世界近代史中泛指资本主义机器大生产,即使用机械化劳动代替手工劳动的资本主义工业场所。在我们设计模式中也生活着这么一家人,他们分别是简单工厂模式,工厂方法模式和抽象工厂模式,他们都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。这三种模式按照可维护可扩展的特点来看,工厂方法模式是简单工厂模式的进化,而抽象工厂模式,又是工厂方法模式的进化。

举个简单的例子,春天是播种的季节,我想此刻在我的家-美丽的遥远的安徽,爷爷奶奶正在菜园子里忙着种植蔬菜苗,如果,奶奶只想让菜园单纯的只要种上蔬菜就可以了,那么就用简单工厂,奶奶养育了四个儿女,大过年的一大家子人回来,奶奶总想让那方团圆桌摆上各式各样的菜肴,这个时候就需要用工厂方法才可以实现,就是把共有的东西抽象出来,菜的种类多了,需要的土地规模就会扩大,如果要扩大菜园子的规模,比如一个在村头,一个在村尾,这样工厂方法就无法实现了,就应当用抽象工厂,各种各样的蔬菜,又组成一个菜园子。接下来,依次来讲解一下,三个工厂,依然以我们上述例子:

首先简单工厂模式, 我们把简单工厂模式比喻成菜园子,菜园子有他自己的属性方法,他封转了浇水,施肥,锄草三个方法,要求类是客户端,她只需要调用农活类和菜园子类就可以完成任务,而不需要 一次调用浇水,施肥,锄草所以,实现了封装。一起来看一下她的类图:

如果菜园子中蔬菜的种类越来越多,比如过长豆角,黄瓜,葫芦等这些蔬菜属于攀藤类蔬菜,需要支撑架来支撑她们来进行持续生长,茄子,茼蒿这些蔬菜需要定时削剪叉枝,以保持主干支的养分,这个时候,我们就需要修改代码,首先,我们需要增加支撑架,削剪的类,然后,在菜园子类中改变select或者是if条件分支语句,这样,不仅增加了类,还需要修改原有的类,这样一来,违背了开放-封闭原则,这也就是为什么简单工厂模式不能列入GOF的23中模式的原因之一。

而此时,我们需要把简单工厂模式中的“菜园子”类加以改进,让她符合开放-封闭原则,也就是取出她的select case选择分支语句,让在增加方法的时候只需要添加类,这样便符合开闭原则,而简单工厂和工程方法的区别,也就在此,看看我们的类图是如何实现的。

我们一直都在写一个菜园子的农作物,但是,如果需要写村头和村尾两个菜园子的农作物,而且我们可以随时切换知道两个菜园子的农作物情况,那么,我们就应该考虑扩充工厂方法模式,而需求不断演化的过程中,我们就重构了一个非常重要的设计模式:抽象工厂模式,类图如下:

无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。拿一个生产水杯(cup)的工厂举例:起初,不用工厂模式,我必须在生产水杯之前知道水杯的材料和形状等水杯的所有特征才能生产,这就是我们的new Cup();这个Cup必须是具体的。

厂主发现同一形状的被子,只是材料不同,如一个是玻璃(glass)的,一个是瓷(china)的,但是确要两条生产线,显然有资源浪费的嫌疑。现在厂主生产杯子时先不让生产线知道我要产的是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了。所以就有了简单工厂模式。原来是Cup cup=new Cup;现在是SimpleCupFactory.createCup(String
cupName),根据cup的名字生产Cup,而createCup返回的是一个实现了 Cup接口或抽象类的具体Cup。

简单抽象工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,工厂里并没有定义相应的处理流程,只能更改createCup方法,这就不合理了。我现在只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就行了吗,干嘛还要更改整条生产线呢?于是就有了工厂模式。原来生产线在生产模具的时候还要考虑是为玻璃杯生产的模具还是为铁杯生产的模具,现在它不用管了。CupFactory.createCup()创建Cup.CupFactory是接口或抽象类。实现它的具体子类会创建符合Cup接口的具体Cup。那么现在厂主想要生产水壶(kettle),用工厂模式就不得不再造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。在原CupFactory中加一个createKettle()方法,用来生产水壶。设计之旅,未完待续......

大话设计模式之三世同堂

时间: 2024-10-10 17:02:47

大话设计模式之三世同堂的相关文章

大话设计模式读书笔记--设计模式总结

前言 大话设计模式看了两遍,之前看过一遍,理解的不深刻, 这次用了一个月多点的时间再次温习,利用下班后的时间回来学习,把学习心得记录下来,加深了对面向对象的理解 之前是看到一个需求搞清楚业务流程之后立刻就去做了,很少从设计层面的角度考虑,现在在开发程序时,开始有了设计的思想,也有了达到可维护,可复用,可扩展目的具体的实现方法 每当看到经过优化代码的效果时,就想起一句话:精彩的代码是如何想出来的,比看到精彩的代码更加令人兴奋 下面是用自己的话进行的总结,以便加深记忆和理解 创建型 抽象工厂 定义:

《大话设计模式》学习笔记系列--1. 简单工厂模式

简单工厂模式实现了一种"工厂"概念的面向对象设计模式,它可以在不指定对象具体类型的情况下创建对象.其实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化具体类.工厂方法让类的实例化推迟到子类中进行. 以书本上的计算器程序为例,其UML描述如下: 图中,AddOperator, SubtactOpertor继承算式基类Operator,而CreateOperator则是负责创建一个操作类,而不指明具体的子类类型. 下面,我们来看代码: 首先操作积累: /// <summa

大话设计模式宏观把控

大话设计模式是我们现在学习的一个重头戏--本来看完C#视频之后,什么都不懂,但看了设计模式书的附录之后,真的感觉瞬间柳暗花明的赶脚呀!现在让我们先来全局的看一下这本书-- 本书通过一些幽默的小例子,以大鸟和小菜对话的方式,主要讲了模式和原则,不得不用一句俗语说:真是生动形象呀! 我把这些模式根据其特点,分成了创建型模式.结构型模式和行为型模式. 模式: 1.策略模式(Strategy):义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户.(商场打折促

大话设计模式的整体总结

大话设计模式通过2个人的对话,讲述了在软件设计中的23个重要的设计模式和6大开发原则在生活中的应用和思想升华的过程,其中的小菜也代表了对面向对象很"了解"但是却脱离了现实开发中各种束缚的入门编程人员,大鸟则代表了在软件开发行业方面有丰富经验,并且能在具体生活中运用的高级开发人才.新老人员之间的对话没有那么多的浮华和不切实际,一开口就是软件开发应该怎么怎么样的,都是从生活的平常角度来解释这23个设计模式和6大原则的,熟悉的场景,通俗易懂的知识,引人入胜爱不释手,非常适合初级开发人员的学习

《大话设计模式》——工厂模式的逐步升级

大话设计模式是面向对象编程的进一步的剖析,等自己学过设计模式之后,才知道面向对象编程的几大大特征-抽象.封装.继承.多态的妙用.设计模式可以说是将这几大特征玩转的淋漓尽致啊.这几天学了设计模式中的工厂模式,觉得有必要总结一下,下面我来谈谈简单工厂模式,工厂方法模式,抽象工厂模式的特点. 一.简单工厂模式 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个子类类(这些子类继承自一个父类或接口)的实例.在父类中定义了一个虚拟的方法,让子类去继承父类,然后到子类中再去重写虚拟的方法

&lt;六&gt;读&lt;&lt;大话设计模式&gt;&gt;之原型模式

原型模式也是很简单的一种模式,对于java来说已经有相应的接口了(Cloneable).关于原型模式<<大话设计模式>>是以投放简历作为例子讲解的,即我要投放很多简历,其实每个简历都一样,所以只要我写好一份,其他的复制就行了,其实就是今天讲的原型模式,就是把要复制的类对象的属性复制到另外一个对象上(其实不是复制而是对象的引用改变). 原型模型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 浅复制VS深复制 关于克隆有两个概念 浅复制:就是只复制值类型的字段,不能

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类