创建型模式抽象了实例化过程,将一个系统独立于于 如何创建、组合和表示他的那些对象。
一个类创建模式使用继承改变被实例化的类。而一个对象创建型模式将实例化委托给另一个对象。
所有的创建型模式都是两个旋律
一是将系统使用哪些具体类的信息封装起来 。
二是 隐藏这些类的实例是如何被创建和组织的,外界对于这些对戏那个只知道他们共同的接口,不清楚具体的实现细节。
====================================================
常见的五种 创建模式
抽象工厂
工厂方法
原型模式
单列模式
建造者模式
工厂模式的三种方式详见上篇博客 工厂三姐妹
单列模式:
保证一个类只有一个实例,并提供一个访问它的全局访问点
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的方法就是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例的方法:
该方式是
Private Static Singleton Instance
Private Singleton()
{
} //以上就防止了外界利用New创建此类实例的可能。 是对唯一实例的受控访问。
注意
细节问题: 多线程中,多个线程同事访问Singleton 类,调用GetInstance()方法,会造成多个实例, 可以给进程一把锁来处理。
Lock 是确保一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,知道该对象被释放。
示例代码
if (instance == null)
{
lock (Root)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
此处用了两个instance,当instance为null,并且同时有两个线程调用Getinstance()方法时,它们将都通过第一重instance=null判断,然后由于lock机制,这两个线程则只能一个进入,另一个在外排队,必须要期中一个进入并出来后,另一个才能进入。而此时如果没第二重的判断,则第一个i线程创建了实例后,而第二个还是继续在创建新势力。这样就没有达到单列目的。
个人小结: 单列模式(SingletonPattern)解决的是实体对象的个数问题,其他的都是解决New 所带来的耦合关系
=============================
建造者模式
创建者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使用一个建造过程生成具有不同内部表象的产品对象。
就是说是用同样的建造过程可以创建不同的产品。
实例 建造小人
Director 是构建一个使用Bulder接口的对象
若要改变一个产品的内部表示,只要再定义一个具体的建造者就可以了/
关键点: 主要用于创建一些复杂的对象. 这些对象内部构建建的建造顺序是稳定的.但对象内部的建造通常是复杂变化的
比较:
同抽象工厂模式类似,两者都返回一些方法和对象组成的类,主要区别在于,抽象工厂返回系列的相关类,而建造者则根据向其提交的逐步构造出复杂对象。
========================================
原型模式:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
关键点是具有克隆自身的方法:Clone(),利用已经存在的对象来克隆一个新的对象。
课本实例 : 简历 的复印
细节问题
浅复制与深复制
Memberwise()方法是这样的。如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象
浅复制: 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
如: 数据集对象DataSet,它就有Clone()方法和Copy()方法。Clone方法用来复制DataSet的结构,但不复制DataSet的数据。实现了浅复制。Copy()方法不但复制结构,也复制数据,就是深复制。
总结:
根据所提供的数据,工厂模式被用来从一些相似的类中选择并返回某个类的一个实例;
抽象工厂模式被用来返回几组类中的一组,在某些情况下,其实际上返回该组类的一个工厂;
生成器模式根据其要表示的数据,把一些对象组装成一个新的对象,通常使用工厂来实现对对象的组装方式的选择;
当创建新的实例需要更多的代价时,原型模式复制或克隆现有的类而不是创建新的实例;
单件模式是这样的一种模式,其确保对象有且只有一个实例,并且确保可获得到该实例的全局访问。