设计模式之建造者
这两天事太多了,没来的及更新。今天早点更新。
今天扯建造者模式。大家都知道一个对象的生成是有过程的。表面上我们看的是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行代码,无师自通,量的改变才能造成质的改变。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?