23种设计模式的创建模式

来源:互联网 发布:python 颜色渐变 编辑:程序博客网 时间:2024/05/22 14:03






1、工厂方法模式(Factory Method)
简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。




2、抽象工厂模式 (Abstract Factory):



抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。




3、单例模式(Singleton)
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。


4、建造者模式(Builder)
定义


将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。




实用范围


1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。


2 当构造过程必须允许被构造的对象有不同表示时。
角色


在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。




5、原型模式(Prototype)


和工厂模式一样,同样对客户隐藏了对象创建工作,但是,与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。

Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。




//抽象工厂void Main(){AbstractFactory.ChooseFactory("A").GetProduct1().Dump();AbstractFactory.ChooseFactory("A").GetProduct2().Dump();AbstractFactory.ChooseFactory("B").GetProduct1().Dump();AbstractFactory.ChooseFactory("B").GetProduct2().Dump();}// Define other methods and classes hereclass Product1{}class Product2{}class Product1A:Product1{}class Product1B:Product1{}class Product2A:Product2{}class Product2B:Product2{}abstract class AbstractFactory{public static AbstractFactory ChooseFactory(string factoryName){switch (factoryName){case "A": return new FactoryA();case "B": return new FactoryB();default: throw new NullReferenceException();}}public abstract Product1 GetProduct1();public abstract Product2 GetProduct2();}class FactoryA:AbstractFactory{public override Product1 GetProduct1(){return new Product1A();}public override Product2 GetProduct2(){return new Product2A();}}class FactoryB:AbstractFactory{public override Product1 GetProduct1(){return new Product1B();}public override Product2 GetProduct2(){return new Product2B();}}
//单例原则void Main(){Singleton s1 = Singleton.GetInttance();Singleton s2 = Singleton.GetInttance();object.ReferenceEquals(s1,s2).Dump();}// Define other methods and classes hereclass Singleton{private Singleton(){}private static Singleton instance = null;private static object obj = new object();public static Singleton GetInttance(){if(instance== null){lock(obj){if(instance==null){instance = new Singleton();}}}return instance;}}
//工厂方法void Main(){}// Define other methods and classes hereclass Product{}class ProductA:Product{}class ProductB:Product{}abstract class Factory{public static Factory ChooseFactory(string factoryName){switch(factoryName){case "A":return new FactoryA();case "B":return new FactoryB();default: throw new NullReferenceException();}}public abstract Product GetProduct();}class FactoryA:Factory{public override Product GetProduct(){return new ProductA();}}class FactoryB:Factory{public override Product GetProduct(){return new ProductB();}}

//简单工厂void Main(){SmimleFactory.GetProduct("A").Dump();SmimleFactory.GetProduct("B").Dump();}// Define other methods and classes hereclass Product{}class ProductA:Product{}class ProductB:Product{}class SmimleFactory{public static Product GetProduct(string ProductName){switch (ProductName){case "A": return new ProductA();case "B": return new ProductA();default: throw new NullReferenceException();}}}

//建造者void Main(){Director d = new Director();d.Set(new BilderA());d.Show();d.Set(new BuilderB());d.Show();}// Define other methods and classes hereclass Director{private Builder builder;public void Set(Builder b){this.builder = b; }public void Show(){builder.ShowA();builder.ShowB();builder.ShowC();}}abstract class Builder{public abstract void ShowA();public abstract void ShowB();public abstract void ShowC();}class BilderA:Builder{public override void ShowA(){"BuilderA-ShowA".Dump();}public override void ShowB(){"BuilderA-ShowB".Dump();}public override void ShowC(){"BuilderA-ShowC".Dump();}}class BuilderB:Builder{public override void ShowA(){"BuildeB-ShowA".Dump();}public override void ShowB(){"BuildeB-ShowB".Dump();}public override void ShowC(){"BuildeB-ShowC".Dump();}}

//原型void Main(){Prototype p1 = new Prototype();p1.Dump();Prototype p2 = new Prototype();p2.Dump();object.ReferenceEquals(p1,p2).Dump();}// Define other methods and classes hereclass Prototype:ICloneable{public object Clone(){return this.MemberwiseClone();}}



0 0
原创粉丝点击