OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记
说OOAD是一门玄学,一点都不为过。又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多。。。总之,一直没能很好理解,哪怕把一本叫做《UML和模式应用》的书翻来覆去好多遍还是没懂。这种感觉吧,像是把一个很难咀嚼的东西硬是吞了下去,刺激胃产生了强烈反应,可惜一堆胃酸还是没能把这东西溶解,反倒是喝了肌酸的感觉。但是,喜大普奔的是,就在刚才,我终于觉得我好像顿悟了些什么。顺便《大话设计模式》是一本好书!浅显易懂。
————————————————————————————————————————————————————————————————
创建者模式,顾名思义,先问一个问题:谁创建了对象X?
书上说:你可以依靠LRG(低表示差异),来从领域模型中获得灵感。
可惜我没太搞懂LRG和领域模型的精髓,所以这句话对我来说是废话。
——————————————————————————————————
那么我们不防先把此模式的角色拎出来:
大致有四种角色:
建造者(Builder):只是指明抽象接口
具体建造者(ConcreteBuilder):用来实现Builder的接口以构造和装配该产品的各个部件
指挥者(Director):指挥(如何造)并构造一个使用Builder接口的对象
产品(Product):表示被构造的复杂对象。理解成一些小零件
把四种角色区分好之后,我们就可以分别定义它们,以及它们之间的关系(这里,我们以上帝创造了人来举例):
建造者(Builder),即上帝,上帝创建了人。那为了创建人,上帝要怎么做?这个怎么做,即builder这个类的方法。人有四肢,所以上帝要先创建头(head)、躯干(body)、手(arm)、腿(leg)。另外,职责驱动设计,上帝的职责最后是要创建一个人出来的,所以builder还要通过协作来创建人(person)这个对象,需要makeperson这个方法。于是,创建者的类就被我们画了出来。
具体建造者(ConcreteBuilder),即具体的人(person),人分胖(FatBuilderPerson)、瘦(SilmBuilderPerson)、美(BeautyBuilderPerson)、丑(UglyBuilderPerson),具体创建者应该继承自创造者(builder),因为不论是胖瘦美丑,都是一个人,都拥有四肢。如此,具体建造者(Concretebuilder)的类我们也画出来了。
指挥者(Director),指挥者是指挥如何把四肢这些部位并在一起,成为真正的人的。所以指挥者需要有一个buildperson的方法。那么指挥者的类也画出来了。
产品(Product),顾名思义,就是一些部件了,在这个例子中,所谓产品具体就是指人的四肢。那么产品这个类也出来了。
知道它们的意义和相互之间的关系,我们可以画出此模式的完整类图啦。
那么相应的代码实现也就简单啦:
// 要建造的产品
public class Person
{
public string Head { get; set; }
public string Body { get; set; }
public string Arm { get; set; }
public string Leg { get; set; }
} // 定义创建者接口,实现者必须实现该接口中定义的所有抽象方法,防止实现者疏忽而遗漏某个部件的创建
public abstract class Builder
{
protected Person Person { get; set; }
public Builder()
{
Person = new Person();
} // 建造头
public abstract void BuildHead();
// 建造身体
public abstract void BuildBody();
// 建造胳膊
public abstract void BuildArm();
// 建造腿
public abstract void BuildLeg(); // 返回生成好的对象,这是一个具体方法,每个子类都可以使用它来返回一个已经创建成功的对象
public Person MakePerson()
{
return Person;
}
} // 建造者的具体实现,这里是要建造出一个瘦子
public class SilmPersonBuilder : Builder
{
public SilmPersonBuilder()
{
Person = new Person();
} public override void BuildHead()
{
Person.Head = "瘦子的脑袋";
} public override void BuildBody()
{
Person.Body = "瘦子的身体";
} public override void BuildArm()
{
Person.Arm = "瘦子的胳膊";
} public override void BuildLeg()
{
Person.Leg = "瘦子的腿";
} } // 建造者的具体实现,这里是要建造出一个胖子
public class FatPersonBuilder : Builder
{
public override void BuildHead()
{
Person.Head = "胖子的脑袋";
} public override void BuildBody()
{
Person.Body = "胖子的身体";
} public override void BuildArm()
{
Person.Head = "胖子的胳膊";
} public override void BuildLeg()
{
Person.Head = "胖子的腿";
}
} // 建造者模式中的指挥者
public class PersonDirector
{
Builder builder;
public PersonDirictor(Builder personBuilder)
{
builder = personBuilder;
} // 指挥创建一个人的过程,并返回创建成功的产品
public Person BuildPerson()
{
builder.BuildHead();
builder.BuildBody();
builder.BuildArm();
builder.BuildLeg(); return builder.MakePerson();
}
}
创建者模式(Creator)的意义和优点:能够将复杂对象的构建和它的表示分离,使同样的构建过程,可以创造不同的表示。对于用户来说,只要给定建造类型不需要知道具体建造过程和细节了。但缺点是内部细节不容易修改。
以上,如有不足请多多指正!
OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记的更多相关文章
- UML和模式应用学习笔记-1(面向对象分析和设计)
UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...
- 《UML和模式应用》读书笔记(一)面向对象分析和设计简单示例
在开始进行对象分析和设计之前,先通过“扔骰子”这个软件(游戏者扔两个骰子,如果总是是7,则赢,否则输),来简单分析下这个过程. 1:用例 需求分析,可能包括人们如何应用的场景或情节,这些都可以被编写成 ...
- 解析UML的面向对象分析与设计
经常听到有朋友抱怨,说学了UML不知该怎么用,或者画了UML却觉得没什么作用.其实,就UML本身来说,它只是一种交流工具,它作为一种标准化交流符号,在OOA&D过程中开发人员间甚至开发人员与客 ...
- .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)
阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...
- 面向对象分析与设计—OOD部分
第三部分 面向对象设计 3.1 面向对象设计(OOD)的定义? 在面向对象分析阶段,已经针对用户需求建立起用面向对象概念描述的系统分析模型.在设计阶段,要考虑为实现系统而采用的计算机设备.操作系统.网 ...
- 面向对象分析与设计—OOA部分
第二部分 面向对象分析 2.1 面向对象分析(OOA)的定义? OOA——面向对象的分析,就是运用面向对象方法进行系统分析,对问题域(问题所涉及的范围)和系统责任(所开发的系统应具备的职能)进行分析与 ...
- 《Linux内核设计与实现》课本第一章&第二章学习笔记
<Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...
- 基于UML的面向对象分析与设计
前言 经常听到有朋友抱怨,说学了UML不知该怎么用,或者画了UML却觉得没什么作用.其实,就UML本身来说,它只是一种交流工具,它作为一种标准化交流符号,在OOA&D过程 ...
- 面向对象分析和设计(OOA/D)
UML不是OOA/D,也不是方法,它仅仅是一种图形表示法(表示的是OOA/D的想法),我们将在OOA/D中应用UML:分析,就是理解客户脑子中的概念,跟客户来沟通,分析出专业术语:设计,对分析出来的专 ...
随机推荐
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
- 探秘IntelliJ IDEA 13中的版本控制——Subversion 1.8
IntelliJ IDEA 中引入的重要特性就是版本控制,而在IntelliJ IDEA 13中的体现便是支持最新的Subversion 1.8. 相对于之前版本对Subversion的支持,Subv ...
- openwrt固件支持3G和4G上网卡
http://wiki.openwrt.org/doc/howtobuild/wireless-router-with-a-3g-dongle Building image with support ...
- python基础课程_学习笔记20:标准库:有些收藏夹——os
标准库:有些收藏夹 os os模块为您提供访问多个操作系统服务特征. os和它的子模块os.path还包含一些用于检查.构造.删除文件夹和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和 ...
- leetcode第24题--Reverse Nodes in k-Group
problem: Given a linked list, reverse the nodes of a linked list k at a time and return its modified ...
- 【转】Android学习系列–App离线下载功能实现
原文:http://www.cnblogs.com/qianxudetianxia/archive/2011/07/20/2108965.html 宜未雨而绸缪,毋临渴而掘井.----朱用纯<治 ...
- attr与prop的区别
我们在获取checked属性值的时候,如果被选中则值为"checked"没选中获取值就是undefined. (引述他人)因为在有些浏览器中比如说只要写disabled,check ...
- 编写Windows Service 备忘
项目需求要做一个定时扫表,将按条件查询到的数据插入或者更新到另一个数据表的需求,老大要求让用window service来做 因为以前没有做过,把这次的经历写出来.作为备忘. 1.什么是windows ...
- Effective C++(19) 设计class犹如设计type
问题聚焦: 这一节不涉及代码,但是我们需要明确的一点是,思想比代码要重要得多. 设计优秀的classes是一项艰巨的工作,就像设计好的types一样. 我们应该带着和“语言设计 ...
- 关于模板pair的用法
在挑战程序设计竞赛中看到调用pair,就上网查了一下 类型申明有两种 template <class T1, class T2> struct pair typedef pairt< ...