创建型模式隐藏了类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样,创建型模式在创建了什么,谁创建的,怎么被创建的,以及何时创建这些方面提供了很大的灵活性。它抽象了实例化的过程。帮助一个系统独立于如何创建、组合和表示他的那些对象。创建型模式都会将关于该系统使用哪些具体的类的信息封装起来。允许客户用结构和功能差别很大的产品对象配置一个系统。
一、简单工厂模式:降低耦合程度,降低实例化对象(容易变化的地方)需要修改的代码范围,考虑用一个单独的类来创造实例过程。
二、工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。工厂方法把简单工厂的内部逻辑判断移到客户端代码进行,减少对工厂类的修改。
三、抽象工厂模式——提供一个创建一系列相关或相互依赖的对象接口,而无需指定他们具体的类
四、建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示.用于创建一些复杂的对象,对象内部构建间的构造顺序通常是稳定的,带对象内部的构件通常面临着复杂的变化,使得建造代码与表示代码分离
五、原型模式:用原型实例指定创建对象的种类,声明一个克隆自身的接口并且通过拷贝这些原型创建新的对象,(像父类)。从一个对象在创建另外一个可定制的对象,而且不需要知道任何细节。
Clone方法:一般初始化信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。不用初始化对象,而是动态的获得对象运行时的状态。但是MemberwiseClone()方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用对象,因此原始对象及其副本引用同一对象。
浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象
深复制:把引用对象的变量指向复制过得的新对象,而不是原有的被引用的对象。
六、单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问的,可以严格地控制客户怎样访问以及何时访问它。在第一次被引用时,将自己实例化,懒汉式单例类
多线程的单例:Lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。
双重锁定:先判断实例是否存在,不存在再做加锁处理
静态初始化:解决了全局访问和实例化控制,依赖公共语言运行库来初始化变量。初始化的方式是在自己被加载时将自己实例化,饿汉式单例类
总结:
模式 | 优点 | 缺点 | 应用 |
简单工厂 模式 | 工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对客户端来说,去除了与具体产品的依赖 | 违反开—闭原则 每次扩展都要更改工厂类 该模式采用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构 | 对容易变化的地方实例化对象较多的情况用一个单独的类来创造实例 (计算器) |
工厂方式模式 | 把工厂职责分类,便于增加功能,而不需要更改原有的工厂类。 | 把内部的逻辑判断移到了客户端代码进行 | 类不知道要创建哪个对象 类用它的子类创建哪个对象 客户清楚创建哪个对象 (雷锋工厂) |
抽象工厂模式 | 易于交换产品系列 具体创建实例过程与客户端分离 | 类比较多,如果需求来自增加功能,需要大批量的改动 | 解决多个类型产品的创建问题 (更换数据库)
|
建造者模式 | 内部表象与产品生成分离,即把建造过程隐藏 | 创建者模式比较符合产品差别不大的对象的创建,如果差别很大,就会导致非常多的具体的创建者,这时候最好结合工厂方法模式 | 创建一些复杂的,内部构造间的建造顺序是稳定的但却是复杂的变化的情况 (画人) |
原型模式 | 由一个对象创建另一个可定制的对象而不需要知道任何创建细节 | 每一个类必须配备一个克隆方法。
| 某些结构复杂对象的创建工作,由于需求的变化,而导致对象的变化 (制作简历) |
单例模式 | 让类自身负责保存它的唯一实例,并提供访问方法,严格控制客户的访问 | 没有抽象层,扩展难度大 | 多个线程共享 (类的计划生育) |