创建型设计模式,顾名思义就是用来创建对象的模式。它抽象了实例化的过程,将一个系统的创建、组合和表示进行了分离。
创建型设计模式包括五种设计模式:抽象工厂模式(Abstract Factory)、建造者模式(Builder)、工厂方法模式(Factory Method)、原型模式(Prototype)和单例(Singleton)模式。他们共有的特点是:1、将系统使用具体类的信息封装 2、隐藏了实例的创建和组织方法。下面分别进行介绍:
抽象工厂模式和工厂方法模式在另一篇博客中(简单工厂、工厂方法与抽象工厂模式对比)已经详细介绍,在此不再赘述。
UML类图
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用性:1、 需要生成的产品对象有复杂的内部结构。
2、 创建复杂对象的算法稳定,或建造者模式可以强迫生成一定的顺序。
3、当构造过程允许被构造的对象有不同的表示时。优点: 1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个ConcreteBuilder都相对独立,而与其它的ConcreteBuilder无关。
3、可使对构造过程更加精细控制。
4、将构建代码和表示代码分开。
缺点: 难于应付“分步骤构建算法”的需求变动。
UML类图
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
适用性:1、当一个系统应该独立于它的产品创建,构成和表示时;
2、当要实例化的类是在运行时刻指定时,例如,通过动态装载;
3、为了避免创建一个与产品类层次平行的工厂类层次时;
优点: 1、它对客户隐藏了具体的产品类,因此减少了客户知道的名字的数目。
2、允许客户只通过注册原型实例就可以将一个具体产品类并入到系统中,客户可以在运行时刻建立和删除原型。
3、具有给一个应用软件动态加载新功能的能力。由于Prototype的独立性较高,可以很容易动态加载新功能而不影响老系统。
4、产品类不需要非得有任何事先确定的等级结构,因为Prototype模式适用于任何的等级结构
扩展: 在原型模式中涉及到克隆,克隆又分为浅复制和深复制:
1、浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的其他对象的引用仍然指向原来的对象。
2、深复制:把引用对象的变量指向复制过得新对象,而不是原有的被引用的对象。
其中需要用到MemberwiseClone()方法即如果字段是值类型的,则对该字段执行逐位复制;如果字段是引用类型,则复制引用但不复制引用的对象。
UML类图
定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性: 1、当类只能有一个实例而且用户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
扩展: 单例模式又分为饿汉式单例类和懒汉式单例类:
1、饿汉式单例类:是由C#与公共语言运行库提供的一种‘静态初始化’方法运行的,解决了多线程环境下不安全的问题,但缺点是自己在被加载时就进行实例化,即
典型的以空间换时间,浪费内存。
2、懒汉式单例类(使用双重锁定):每次获取实例前都会进行判断,看是否需要创建实例。只有在第一次被引用时,才会将自己实例化。
优点: 1、对唯一实例的受控访问。由于Singleton类封装它的唯一实例,故可以严格地控制客户怎样访问它以及何时访问它。
2、允许可变数目的实例。