一、单例模式(SP):
- 定义:
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 - 优点:
(1)单例模式在内存中只有一个实例,减少了内存开支;
(2)减少了系统的性能开销;
(3)避免对资源的多重占用;
(4)可以在全局设置资源访问点,优化和共享资源访问; - 缺点:
(1)一般没有接口,难以扩展;
(2)对测试不利;
(3)和单一职责原则冲突。 - 使用场景(需注意:多线程并发和单例复制两种情况):
(1)要求生成唯一序列号的环境;
(2)在整个项目中需要一个共享访问点或者共享数据(如web页面上的计数器);
(3)创建对象消耗的资源的过多(如I/O操作和数据库);
(4)需要定义大量的静态常量和静态方法(如工具类)的环境。
二、工厂方法模式:
- 定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - 优点:
(1)封装性好;
(2)扩展性好;
(3)屏蔽产品类;
(4)工厂方法模式是典型的解耦框架,符合迪米特法则、依赖倒置原则和里氏替换原则。 - 应用场景:
(1)工厂方法模式是new一个对象的替代品。
(2)需要灵活的、可扩展框架时;
(3)可用于异构系统中;
(4)可用于测试驱动开发的框架下; - 扩展:
(1)缩小为简单工厂模式;
(2)升级为多个工厂类;
(3)替代单例模式;
(4)延迟初始化;
三、抽象工厂模式(AFP):
- 定义:
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。 - 优点:
(1)封装性;
(2)产品族内的约束为非公开状态; - 缺点:
产品族扩展非常困难。(但增加一个产品等级则相对简单,且符合开闭原则。) - 使用场景:
当一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
四、建造者模式(BP):
- 定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 四个角色:
Product产品类、Builder抽象建造者、ConcreteBuilder具体建造者和Director导演类。 - 优点:
(1)封装性;
(2)建造者独立,容易扩展;
(3)便于控制细节风险。 - 使用场景:
(1)相同的方法,不同的执行顺序,产生不同的事件结果;
(2)多个部件或零件都可以装到一个对象中,但产生的结果又不相同时;
(3)产品类非常复杂或产品类中的调用顺序不同产生了不同的效能;
(4)在对象创建过程中用到了其他对象。 - 建造者模式和工厂方法模式的区别:
建造者模式和工厂方法模式非常相似,它们之间最大的区别在于:建造者模式最主要的功能是基本方法调用的顺序安排。 - 实践:
通常和模板方法模式一起使用。
五、原型模式(PP)(又叫克隆模式):
- 定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。(核心是clone方法) - 优点:
(1)性能优良;(相对于new一个对象而言,性能更优越)
(2)逃避构造函数的约束。(copy一个对象时,构造函数不被执行) - 使用场景:(通常和抽象工厂模式相结合)
(1)资源优化场景(类初始化需要消化非常多的资源);
(2)性能和安全要求的场景;
(3)一个对象多个修改者的场景。 - 注意事项:(使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量,而不是方法内变量;二是必须是一个可变的引用对象,而不是一个原始类型或不可变对象)
(1)构造函数不会被执行;
(2)浅拷贝与深拷贝;