博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之建造者
阅读量:6555 次
发布时间:2019-06-24

本文共 2373 字,大约阅读时间需要 7 分钟。

这两天事太多了,没来的及更新。今天早点更新。

今天扯建造者模式。大家都知道一个对象的生成是有过程的。表面上我们看的是New,其实编译器是有一定细节指令代码的。比如我们建房子,需要挖地基,砌墙,上顶等。这些操作步骤不需要我们动手,交给泥瓦工就行了。我们提供的只是,这个宅基地地方,材料等而已。

2.引用类型在传递过程中传的是引用,其托管堆中的数据可以进程共享。

3.设计模式之类的东西就是让思路与实现分离。

原来C语言面向过程的结构化程序一层一层的剥离封装变成面向对象的程序。

直接用例子说明,继续上别人的代码(备注:研究学习用,所有权归原作者),我来解释:

//这个类是对应设计师,只设计规划,不去做具体的实施过程。

abstract class PersonBuilder

{

//要建造房子需要哪些材料:比如砖,沙,灰,土等

protected Graphics g;
protected Pen p;

public PersonBuilder(Graphics g, Pen p)

{
this.g = g;
this.p = p;
}

//建造房子需要哪些步骤,比如挖地基,砌墙,上顶等这些只是一般的思路,先设计好,不进行具体操作。

public abstract void BuildHead();

public abstract void BuildBody();
public abstract void BuildArmLeft();
public abstract void BuildArmRight();
public abstract void BuildLegLeft();
public abstract void BuildLegRight();
}

//这是设计的具体实现,招的那批擅长建造别墅的泥瓦工

class PersonFatBuilder : PersonBuilder

{
public PersonFatBuilder(Graphics g, Pen p)
: base(g, p)
{ }

//具体实施设计师的步骤

public override void BuildHead()

{
g.DrawEllipse(p, 50, 20, 30, 30);
}

public override void BuildBody()

{
g.DrawEllipse(p, 45, 50, 40, 50);
}

public override void BuildArmLeft()

{
g.DrawLine(p, 50, 50, 30, 100);
}

public override void BuildArmRight()

{
g.DrawLine(p, 80, 50, 100, 100);
}

public override void BuildLegLeft()

{
g.DrawLine(p, 60, 100, 45, 150);
}

public override void BuildLegRight()

{
g.DrawLine(p, 70, 100, 85, 150);
}
}

//包工头负责使用那些泥瓦工

class PersonDirector

{

//那些泥瓦工的引用

private PersonBuilder pb;
public PersonDirector(string type, Graphics g, Pen p)
{
string assemblyName="建造者模式";
object[] args = new object[2];
args[0] = g;
args[1] = p;

//雇主想让建造什么类型的房子,我都有对应的人手

this.pb = (PersonBuilder)Assembly.Load(assemblyName).CreateInstance(assemblyName+".Person" + type + "Builder", false, BindingFlags.Default, null, args, null, null);

}

//包工头不干活,只让泥瓦工具体实施

public void CreatePerson()

{
pb.BuildHead();
pb.BuildBody();
pb.BuildArmLeft();
pb.BuildArmRight();
pb.BuildLegLeft();
pb.BuildLegRight();
}
}

//雇主买需要的材料

Pen p = new Pen(Color.Yellow);

//雇主决定建造什么类型的房子

PersonDirector pdThin = new PersonDirector("Thin",pictureBox1.CreateGraphics(),p);
pdThin.CreatePerson();

PersonDirector pdFat = new PersonDirector("Fat", pictureBox2.CreateGraphics(), p);

pdFat.CreatePerson();

 

继续总结:设计模式这些东西都是理论上的,说的再多,具体项目中用的少,照样记不住,想不到。

设计模式对应一类问题的解决方案,可以认为是前人留下的经验。

 

还想再说一遍:C#中的引用类型就相当于指针变量。ref 引用类型 相当于指针的指针变量。

不扯了,学编程没有捷径,写上10W行代码,无师自通,量的改变才能造成质的改变。

 

转载于:https://www.cnblogs.com/wang-charle/p/8645615.html

你可能感兴趣的文章
Android中显示进度的控件
查看>>
Lubuntu下安装Python3.6
查看>>
〖Linux〗zigbee实验之cc2430移植tinyos2.x的步骤(Ubuntu13.10)
查看>>
PHP(五)session和文件上传初步
查看>>
【JS库】URI.js
查看>>
XML 解析之 dom4j 解析器
查看>>
BZOJ4314 倍数?倍数!
查看>>
js获取json对象中的key和value,并组成新数组
查看>>
作诗2(玄学)
查看>>
UOJ #449. 【集训队作业2018】喂鸽子
查看>>
biztalk 2010 映射
查看>>
MongoDB数据库
查看>>
时钟设计技巧
查看>>
营业额统计 Treap TYVJ1185
查看>>
html5的float属性超详解(display,position, float)(文本流)
查看>>
js进阶 11-13 jquery如何包裹元素和去除元素外的包裹
查看>>
IMS 相关名词解释
查看>>
Apache 服务器安装和配置相关资料
查看>>
收藏夹
查看>>
蓝桥杯练习 完美的代价(回文)(贪心)
查看>>