【设计模式】之创建型模式
根据模式的特点,《设计模式》将23个模式分为三个类别:创建型模式、结构型模式和行为型模式。
下面我将依次介绍创建型模式的定义:
1、工厂方法模式 (Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
关键代码:
interface IFactory //雷锋工厂
{
LeiFeng CreateLeiFeng();
}
class Undergraduatefactory : IFactory //学雷锋的大学生工厂
{
public LeiFeng CreateLeiFeng()
{
return new Undergraduate();
}
}
//客户端:
IFactory factory = new Undergraduatefactory(); //要换成“社区志愿者”修改此处即可
LeiFeng student = factory.CreateLeiFeng();
2、抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
注:抽象工厂模式是工厂模式的拓展。代码类似
关系:
1)继承关系:抽象工厂和具体工厂、抽象产品和具体产品
2)依赖关系:具体工厂依赖于具体产品
好处:
1)易于交换产品系列。IFactory factory = new AccessFactory(); //只需确定实例化哪一个数据库访问对象给factory
2)让具体的创建实例过程与客户端分离。客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。如:客户端只需知道 IUser 和 IDepartment 接口
解决问题:多个类型产品的创建问题
但过于臃肿,如果要增加一个需求,需增加多个类,修改多个类。
3、建造者 Builder 模式,又叫生成器模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
关系:
继承关系:抽象建造者接口和具体建造者 如:人和胖子、瘦子
聚合关系:指挥者(使用接口的对象)和抽象建造者接口 如:指挥者和人
依赖关系:具体建造者和具体产品
好处:建造代码与表示代码分离。用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了。
关键代码:
//指挥者,控制建造过程,隔离用户与建造过程的关联
class PersonDirector
{
private PersonBuilder pb;
public PersonDirector(PersonBuilder pb)//用户告诉指挥者,需要什么样的小人
{
this.pb = pb;
}
public void CreatePerson()
{
//根据用户的选择建造小人
pb.Buildhead();
pb.BuildBody();
pb.BuildArmLeft();
pb.BuildArmRight();
pb.BuildLegLeft();
pb.BuildLegRight();
}
4、原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
关系:
继承关系:原型类(接口)和 具体原型类
解决问题:数据结构的复制问题
好处:隐藏了对象创建的细节,又大大提高了性能。
关键代码:
class Resume:ICloneable
{
public Object Clone()
{
return (Object)this.MemberwiseClone();//创建当前对象的浅表副本
}
}
//客户端:
{
Resume a = new Resume("不弃");
a.SetPersonalInfo("女", "20");
a.SetWorkExperience("1998-2000", "xx公司");
//调用Clone 方法,实现新简历的生成,并修改新简历的细节
Resume b = (Resume)a.Clone()
b.SetWorkExperience("1998-2005", "YY公司");
注:建造者模式和原型模式都隐藏了对象创建的过程。
5、单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
关键:将构造方法改为私有。再写一个public方法,目的返回一个类实例,在该方法中判断是否有实例化过。
好处:客户端不需要考虑是否需要实例化问题。
以上是小编的学习总结,欢迎指点。