【C#】设计模式-创建型模式
来源:互联网 发布:java变量类型怎么赋值 编辑:程序博客网 时间:2024/06/06 11:44
【序】
设计模式学到这小编唯有总结才能抒发内心的兴奋,23个设计模式中分为三个类别,在本文中小编只是挑出了一类创建型模式来总结。
【正文】
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建,组合和表示他的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
· 它们都将关于该系统使用哪些具体的类的信息封装起来。
· 它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道方法的是由抽象类所定义的接口。
单例模式
单例模式(饿汉模式):保证一个类仅有一个实例,并提供一个访问他的全局访问点。
举例:对MDI窗体点击多次出现的多个“工具箱”进行“计划生育”。
模式基本代码:
class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1 == s2) { Console.WriteLine("Objects are the same instance"); } Console.Read(); } } class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); private Singleton() { } public static Singleton GetInstance() { if (instance == null) { lock (syncRoot) { if (instance == null) { instance = new Singleton(); } } } return instance; }
总结:单例模式是为了控制在运行期间,某些类的实例数目只能有一个。如果你想要控制多个,可以利用 Map 来帮助缓存多个实例。
工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。
举例:做雷锋不需要知道真实姓名, 只要封装好谁做好事都一样。做的好事都在工厂里进行,降低了耦合。
模式基本代码:
public class Complex{ public double real; public double imaginary; public static Complex fromCartesianFactory(double real, double imaginary ) { return new Complex(real, imaginary); } public static Complex fromPolarFactory(double modulus , double angle ) { return new Complex(modulus * Math.Cos(angle), modulus * Math.Sin(angle)); } private Complex (double a, double b) { real = a; imaginary = b; }}Complex product = Complex.fromPolarFactory(1,pi);
总结:下列情况可以考虑使用工厂方法模式:
· 创建对象需要大量重复的代码。
· 创建对象需要访问某些信息,而这些信息不应该包含在复合类中。
· 创建对象的生命周期必须集中管理,以保证在整个程序中具有一致的行为。
抽象工厂模式
抽象工厂模式:提供一个创建一系列或相关依赖对象的接口,而无需指定他们具体的类。
举例:、
模型基本代码:
class Program { static void Main(string[] args) { AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); Console.Read(); } } abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } abstract class AbstractProductA { } abstract class AbstractProductB { public abstract void Interact(AbstractProductA a); } class ProductA1 : AbstractProductA { } class ProductB1 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } class ProductA2 : AbstractProductA { } class ProductB2 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } class Client { private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; // Constructor public Client(AbstractFactory factory) { AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); } public void Run() { AbstractProductB.Interact(AbstractProductA); } }
总结:
·一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
·系统中有多于一个的产品族,而每次只使用其中某一产品族。
·属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
·系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离。
举例:
模式基本代码:
class Program { static void Main(string[] args) { Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); director.Construct(b1); Product p1 = b1.GetResult(); p1.Show(); director.Construct(b2); Product p2 = b2.GetResult(); p2.Show(); Console.Read(); } } class Director { public void Construct(Builder builder) { builder.BuildPartA(); builder.BuildPartB(); } } abstract class Builder { public abstract void BuildPartA(); public abstract void BuildPartB(); public abstract Product GetResult(); } class ConcreteBuilder1 : Builder { private Product product = new Product(); public override void BuildPartA() { product.Add("部件A"); } public override void BuildPartB() { product.Add("部件B"); } public override Product GetResult() { return product; } } class ConcreteBuilder2 : Builder { private Product product = new Product(); public override void BuildPartA() { product.Add("部件X"); } public override void BuildPartB() { product.Add("部件Y"); } public override Product GetResult() { return product; } } class Product { IList<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("\n产品 创建 ----"); foreach (string part in parts) { Console.WriteLine(part); } } }
总结:建造者模式可以将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。也就是说如果我们用了建造者模式,那么用户就需要指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
举例:更改简历,先把简历实例化,再利用浅复制和神复制。
模式基本代码:
class Program { static void Main(string[] args) { ConcretePrototype1 p1 = new ConcretePrototype1("I"); ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); Console.WriteLine("Cloned: {0}", c1.Id); ConcretePrototype2 p2 = new ConcretePrototype2("II"); ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone(); Console.WriteLine("Cloned: {0}", c2.Id); // Wait for user Console.Read(); } } abstract class Prototype { private string id; // Constructor public Prototype(string id) { this.id = id; } // Property public string Id { get { return id; } } public abstract Prototype Clone(); } class ConcretePrototype1 : Prototype { // Constructor public ConcretePrototype1(string id) : base(id) { } public override Prototype Clone() { // Shallow copy return (Prototype)this.MemberwiseClone(); } } class ConcretePrototype2 : Prototype { // Constructor public ConcretePrototype2(string id) : base(id) { } public override Prototype Clone() { // Shallow copy return (Prototype)this.MemberwiseClone(); } }
总结:
· Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。
· Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来实现,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方不断地Clone。
· Prototype模式中的Clone方法可以利用Object类的MemberwiseClone()或者序列化来实现深拷贝。
---参考 大话设计模式 程杰
- 【C#】设计模式-创建型模式
- 设计模式-创建型模式
- [设计模式]--创建型模式
- 设计模式--创建型模式
- 设计模式---创建型模式
- [设计模式] - 创建型模式
- 设计模式:创建型模式
- 设计模式:创建型模式
- 设计模式---创建型模式
- 设计模式---创建型模式
- 设计模式---创建型模式
- 【设计模式】创建型模式
- 设计模式-创建型模式
- 设计模式-创建型模式
- [设计模式]创建型模式
- 设计模式---创建型模式
- 设计模式 -- 创建型模式
- 设计模式-创建型模式
- java数组初始化
- 51 Nod 1021 石子归并
- 信号处理第二课:矩阵的 Fantastic Four
- Q108:浅析PBRT-V3的代码结构
- 开通博客,记录以后的知识积累
- 【C#】设计模式-创建型模式
- js 小数取整的函数
- HandlerInterceptor
- Spark之RDD的属性
- http慢速连接攻击
- Unity中SLua、Tolua、XLua和ILRuntime效率评测
- java基础--for循环嵌套实现九九乘法表
- Oracle创建表空间
- Java该如何从入门到精通?