创建型模式有以下几个模式:
简单工厂 : 用来生产同一等级结构中的任意产品。(不支持拓展增加产品)
工厂方法 :用来生产同一等级结构中的固定产品。(支持拓展增加产品)
抽象工厂 :用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)
建造者模式:将建造人各个躯体的方法和躯体的具体数据分离开来,使得相同的方法,可以建立不同形态的人
原型模式:通过拷贝,可以将代码中的数据和具体实现复制过来,也可以将其中的数据修改
单例模式:将实例化的代码私有化,在公共方法中加以判断,符合条件的可以进行实例化,否则,不可以实例化。
创建者模式:隐藏了这些类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样,创建型模式在创建了什么,谁创建它,它是怎么被创建的,以及何时创建这些方面提供了很大的灵活性。
工厂方法:
概念:如果在主程序中调用工厂类中的加法,那么实例化加法类,也就是说定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
优点:在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖
static void Main(string[] args)
{
IFactory operFactory = new AddFactory(); //在客户端调用加法,让客户端来判断
Operation oper = operFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
}
具体的应用:http://www.runoob.com/design-pattern/factory-pattern.html
抽象工厂
概念:抽象工厂是应对产品族概念的。上边的工厂方法模式是一种极端情况的抽象工厂模式(即只生产一种产品的抽象工厂模式),而抽象工厂模式可以看成是工厂方法模式的一种推广。
优点:
1.当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
2.在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
3.它让具体的创建实例过程与客户端分离,客户端是通多她们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。
具体应用:http://www.runoob.com/design-pattern/abstract-factory-pattern.html
建造者模式:
概念:
1.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了。
何时时候使用:
1。用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
2.是在当常见复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
优点:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。
具体应用:http://www.runoob.com/design-pattern/builder-pattern.html
原型模式:
概念:
1.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
2.从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。(系统自带的方法)
例子:细胞分裂
Resume a = new Resume("大鸟");
a.SetPersonalInfo("男", "29"); //向简历的方法中的参数添加相应的值
a.SetWorkExperience("1998-2000", "XX公司");
Resume b = (Resume)a.Clone(); //复制a中的参数和值
b.SetWorkExperience("1998-2006", "YY企业"); //修改相应的参数中的值
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
具体应用:http://www.runoob.com/design-pattern/prototype-pattern.html
单例模式:
概念:
1.保证一个类仅有一个实例,并提供一个访问它的全局访问点
①
private static FormToolbox ftb = null; //系统自带
private FormToolbox() //系统自带,把public改为private,就不可以让外界实例化了(保证一个类仅有一个实例)
{
InitializeComponent();
}
public static FormToolbox GetInstance() //外界想要实例化需要通过下面的条件,才可以实例化(提供一个访问它的全局访问点)
{
if (ftb == null || ftb.IsDisposed)
{
ftb = new FormToolbox();
ftb.MdiParent = Form1.ActiveForm;
//在这个方法里面写show也能show出来
ftb.Show();
}
return ftb;
}
②
//将下面类的构造函数private,将外界利用new创建此类实例的可能堵死
class Singleton
{
private static Singleton instance; //私有Singleton类的对象instance
//为了改变访问修饰符
private Singleton() ///私有构造函数
{ }
public static Singleton GetInstance() //当外界访问这个方法的时候,只有符合条件,才能在这个类中实例化这个类
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
饿汉式单例类:静态初化
private static readonly object syncRoot = new object(); //在加载时就将自己实例化
懒汉式单例类:第一次被引用时,才会将自己实例化(new)
ObjectStructure o = new ObjectStructure();
多线程的单例和双重锁定
具体应用:http://www.runoob.com/design-pattern/singleton-pattern.html