标签:style blog http color 使用 strong
创建型模式,包括了5种设计模式,分别是 Singleton (单例模式),Factory(工厂模式),AbstractFactory(抽象工厂模式),Builder(创建者),Prototype(原型) ,创建型模式主要作用就是抽象了实例化过程。他们帮助一个系统独立于如何创建、组合和表示他的那些对象。一个类创建型模式使用继承改变被实例化的类。而一个对象创建型模式将实例化委托给另一个对象。
2.Singleton (单例模式)
单例模式的要点有三个 1.这个类就能有一个实例2.自己创建这个实例3.自己像整个系统中提供这个实例 我们要如何来用C#来写一个单例类了
public class Singleton { private static Singleton thisinstance = null; public static object obj = new object(); public Singleton instance() { if (thisinstance == null) { lock (obj) { if (thisinstance == null) {
// 创建类实例 thisinstance = new Singleton(); } } }
return thisinstance; } //私有化够着函数 private Singleton() { } }
在上面的代码中。我们通过私有化构造函数,使得Singleton类不能被 New ,通过对外提供的instance 让调用者可以使用的他的唯一实例。并保证内部只能生个一个实例
3.Factory(工厂模式)
工厂模式的要点: 父类负责定义创建对象的公共接口,而子类负责生成具体的对象。即由子类来决定具体实例那个类
如上类图:
product 定义产品的接口
ConcretePordcut : 负责实现接口product
Creator 负责声明一个工厂方法 返回一个产品实例
ConcretePordcut 负责实现工厂方法
/// <summary> /// 产品接口 /// </summary> public interface Pordcut { void a(); } /// <summary> /// 实际产品 /// </summary> public class ConcretePordcut : Pordcut { public void a() { throw new NotImplementedException(); } } /// <summary> /// 声明工厂 /// </summary> public class Creator { public abstract Pordcut CreatorPordcut(); } /// <summary> /// 实现工厂类 /// </summary> public class ConcreteCreator : Creator { public override Pordcut CreatorPordcut() { return new ConcretePordcut(); } }
4.AbstractFactory(抽象工厂模式)
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类 一个抽象工厂类,可以派生出多个具体工厂类每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。
两者的区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
实现代码:
/// <summary> /// 抽象产品A /// </summary> public abstract class PordcutA { public abstract void RunA(); } /// <summary> /// 抽象产品B /// </summary> public abstract class PordcutB { public abstract void RunB(); } /// <summary> /// 实际产品A /// </summary> public class ConcretePordcutA : PordcutA { public override void RunA() { throw new NotImplementedException(); } } /// <summary> /// 实际产品B /// </summary> public class ConcretePordcutB : PordcutB { public override void RunB() { throw new NotImplementedException(); } } public abstract class PordcutFactory { public abstract PordcutA CreatA(); public abstract PordcutB CreatB(); } public class ConcreteFactory : PordcutFactory { public override PordcutA CreatA() { return new ConcretePordcutA(); } public override PordcutB CreatB() { return new ConcretePordcutB(); } }
5.Builder(创建者)
创建模式 将一个复杂的对象的构建与它表示分离,使同样的构建过程可以创建不同的表示。创建模式是一步步的创建一个复杂的对象
它允许用户只通过负责对象的类型和内容就可以创建和构造他们,而且不知道构造细节 比如建房子 需要 地基->房梁->房顶->围栏
如下代码的实践
public interface IBuilder { /// <summary> /// 创建部分1 /// </summary> void CretaPart1(); /// <summary> /// 创建部分2 /// </summary> void CretaPart2(); /// <summary> /// 创建部分3 /// </summary> void CretaPart3(); /// <summary> /// 创建部分4 /// </summary> void CretaPart4(); } /// <summary> /// 实际的创建者 /// </summary> public class conncreteBuilder : IBuilder { public House _house; public conncreteBuilder(House builder) { _house = builder; } public void CretaPart1() { _house.CreatBeams(); } public void CretaPart2() { _house.CreatFence(); } public void CretaPart3() { _house.CreatFoundation(); } public void CretaPart4() { _house.CreatRoof(); } } /// <summary> /// 指导者 /// </summary> public class Director { public void Build(IBuilder builder) { builder.CretaPart1(); builder.CretaPart2(); builder.CretaPart3(); builder.CretaPart4(); } } public class House { /// <summary> /// 房顶 /// </summary> public void CreatRoof() { } /// <summary> /// 房梁 /// </summary> public void CreatBeams() { } /// <summary> /// 围栏 /// </summary> public void CreatFence() { } /// <summary> /// 地基 /// </summary> public void CreatFoundation() { }
6.Prototype(原型)
原型其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例,其原理是通过一个原型对象传给那个要创建的对象,这个要创建的对象通过请求原型对象。来实施复制自己, 感觉自己也没有很理解这个
/// <summary> /// 定义学生成绩 /// </summary> public interface IStudent { IStudent Clone(); /// <summary> /// 语文 /// </summary> int Chinese { get; set; } /// <summary> /// 学校 /// </summary> int Mathematics { get; set; } /// <summary> /// 英文 /// </summary> int English { get; set; } } /// <summary> /// 一年级学生 /// </summary> public class FirstGrade : IStudent { /// <summary> /// 语文 /// </summary> private int _Chinese; /// <summary> /// 数学 /// </summary> private int _Mathematics; /// <summary> /// 英语 /// </summary> private int _English; public IStudent Clone() { return (IStudent)this.MemberwiseClone(); } public int Chinese { get { return _Chinese; } set { _Chinese = value; } } public int Mathematics { get { return _Mathematics; } set { _Mathematics = value; } } public int English { get { return _English; } set { _English = value; } } }
(希望对大家有帮助,哈哈)
标签:style blog http color 使用 strong
原文地址:http://www.cnblogs.com/crystal189/p/3812151.html