在大话这本书中一共介绍了24个设计模式,在这20多个设计模式中,我们把它们分为三大类——创建型、结构型、行为型。在本篇博客中我将总结这三大类型之一的创建型模式。
创建型模式包括:单例模式、工厂方法、抽象工厂、建造者模式、原型模式。在前面的博客中已经对简单工厂、工厂方法、抽象工厂进行了简单的总结,所以在下文中主要对其余几种模式总结。
(一)建造者模式
定义:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
基本结构:
实例:现在我们需要建造(组装)一辆汽车,大致步骤分为:建造发动机、框架、车盖、轮胎等,我们现在只知道客户暂时需要跑车和轿车两种,下面来看一下类图:
代码实现:
class Program { //首先定义一个建造汽车的类,来把建造过程稳定住,避免遗忘建造步骤 abstract class CarBuilder { public abstract void BuildEngine(); public abstract void BuildFrame(); public abstract void BuildTire(); public abstract void BuildBonnet(); } //建造跑车 class SportscarBuilder : CarBuilder { public override void BuildBonnet() { Console.WriteLine("建造轮胎"); } public override void BuildEngine() { Console.WriteLine("建造发动机"); } public override void BuildFrame() { Console.WriteLine("建造框架"); } public override void BuildTire() { Console.WriteLine("建造车盖"); } } //如果想让我们客户端不关心建造过程,那么我们需要一个很重要的类——指挥者 class CarDirector { private CarBuilder cb; public CarDirector(CarBuilder cb) { this.cb = cb; //用户高速指挥者,我需要什么样的汽车 } public void CreateCar() { cb.BuildBonnet(); cb.BuildEngine(); cb.BuildFrame(); cb.BuildTire(); } } static void Main(string[] args) { SportscarBuilder 跑车 = new SportscarBuilder(); CarDirector 建造指挥 = new CarDirector(跑车); 建造指挥.CreateCar(); }
从这个例子中我们就可以看出,如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。很好的体现了创建过程和实现的分离。并且如果我们想增加一个赛车的建造,只需增加一个赛车类去继承CarBuilder类就可以了。
(二)单例模式
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
此模式比较简单就不在给出详细的介绍
(三)原型模式
定义:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型图:
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不许知道任何创建细节。
实例代码:
class Resume : ICloneable { private string name; private string sex; private string age; private string timeArea; private string company; public Resume(string name) { this.name = name; } //设置个人信息 public void SetPersonalInfo(string sex, string age) { this.sex = sex; this.age = age; } //设置工作经历 public void SetWorkExperience(string timeArea, string company) { this.timeArea = timeArea; this.company = company; } public void Display() { Console.WriteLine("{0} {1} {2}", name, sex, age); Console.WriteLine("{0} {1}", timeArea, company);//实现接口的方法,用来克隆对象 } public object Clone() { return (object)this.MemberwiseClone(); } } static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPersonalInfo("男","29"); a.SetWorkExperience("1998-2000","xx公司"); Resume b =(Resume)a.Clone(); b.SetWorkExperience("1998-2006","YY公司"); Resume c=(Resume)a.Clone(); c.SetPersonalInfo("男","24"); a.Display(); b.Display(); c.Display(); Console.Read();
小结
创建型模式(Creational pattern)为你创建对象,而不必由你直接实例化对象。针对给定的案例,程序可以在确定需要创建哪些对象使获得更大的灵活性。