介绍这个设计模式之前,我先说两个知识点。Is-a、Has-a。
Is-a 指一个类是另一个类的一种,是属于关系。
Has-a 指表示一个角色的一项责任。
创建一个复杂的对象,让其由各部分子对象通过一定的步骤而组合而成。这就是建造者模式。
小明跟女神交往过程中,总是感觉进展缓慢。于是小明就决定用一个烛光晚餐的惊喜,来打动女神。
但是,小明就一个人,他白天要约女神出来。所以他准备雇佣一个人来进行烛光晚餐的准备。
剧情看着很简单,但是我们来分析一下,怎么构造这种场景。
首先,必要的人物就是小明和雇佣的人。如果使用建造者模式的话。可以把小明看作指挥者,然后雇佣的小A(起个名字,方便些)是建造者。
然后,我们要定义具体有什么工作。和烛光晚餐的具备的东西。
最后,我们由小明来指挥,雇佣的人进行干活。
那么我们接下来用建造者模式,来构造此剧情。
首先创建烛光晚餐这个类,一共两个方法,准备和开始吃。
public class Supper { IList<string> list = new List<string>(); public void Add(string name) { list.Add(name); } public void GetSupper() { foreach (string name in list) { Console.WriteLine(name+"。完毕"); } Console.WriteLine("可以享用晚餐了"); } }
准备步骤用一个List来存放,开始吃会先循环这个List,然后进行享用。
首先把建造者的任务,抽象为类。然后把小A继承这个抽象类,来实现具体的操作。
public abstract class Hire { //蜡烛 public abstract void Candle(); //牛排 public abstract void Steak(); //香槟 public abstract void Champagne(); //烛光晚餐 public abstract Supper GetSupper(); } public class SomeA : Hire { Supper Su = new Supper(); public override void Candle() { Su.Add("购买蜡烛"); } public override void Champagne() { Su.Add("制作牛排"); } public override void Steak() { Su.Add("拿出香槟"); } public override Supper GetSupper() { return Su; } }
每执行一个步骤,都会向烛光晚餐添加一条信息。代码很简单,没啥说的。
小明同学有两个方法,第一指挥小A准备晚餐。第二跟女神吃完饭。
public class SomeMing { public void Read(Hire hi) { hi.Candle(); hi.Champagne(); hi.Steak(); } public void Go(Hire hi) { Supper sup = hi.GetSupper(); sup.GetSupper(); } }
很简单,没啥说的。
小明同学约女神,然后打电话给小A让他准备晚餐。然后去吃烛光晚餐。
static void Main(string[] args) { Console.WriteLine("小明约出女神"); Console.WriteLine("小明开始让小A准备晚餐"); SomeMing m = new SomeMing(); Hire hi = new SomeA(); m.Read(hi); Console.WriteLine("晚餐准备完毕"); m.Go(hi); Console.ReadLine(); }
执行结果
建造者模式,创建烛光晚餐这种复杂对象,会分为几个小责任,这样会拼接成一个复杂的对象。而且指挥者和建造者也进行了解耦。
我如果添加建造者,只要实现抽象类。则指挥者和现有建造者不用进行任何改动。
常用场景:需要构建一批过程相同但构造过程非常复杂的产品。
选择关键点:产品的构造过程是否相同。
至此,创建型模式的6个设计模式,介绍完毕。不管你们懂不懂,反正我懂了。
创建型设计模式,就是用来创建对象的模式。并且抽象了实例化的过程。
所有的创建型设计模式都有两个共同点:
一、它们都将系统使用那些具体类封装起来。
二、它们隐藏了这些类的实例是如何被创建和组成。
设计模式是可以组合使用的,比如说抽象工厂中,带着单例模式。都是可以的。
接下来,我们介绍结构型的7种设计模式。我们的主人公小明同学,到底跟女神还会发生什么事情呢?我们接着往下看~
By~ 下一节:结构型模式(一)适配器模式