前言
发现无论是什么设计模式,其实总的原则就是减少耦合,增加可复用代码,使系统更易于扩展
参考书籍:《秒懂设计模式》
1、单例模式(Singleton)
- 单例模式:即单一的实例,同时提供几种、统一的访问接口,以使行为保持协调一致
- 饿汉模式:即在初始阶段就主动进行实例化,并时刻保持一种渴求的状态,无论此单例是否有人使用。举例如下
详细说明:把单例设置为static、final,即一开始就创建实例和一旦被赋值就无法修改;然后构造方法私有化,不允许外人构造;但其他类可以通过公开的getInstance获取实例; - 懒汉模式:其他同上,但是实例只有在被使用时才会被构建。举例如下:
详细说明:volatile关键字能保证变量值在各线程访问时的同步性和唯一性;synchronized是为了加同步锁,保证多线程并发下逻辑的准确性。
2、原型模式(Prototype)
- 原型模式:可以用对象创建对象,而不是用类创建对象,以此达到效率的提升。即可以直接复制现存的对象,而不用通过新建对象并一步步初始化来创建新对象。举例如下:
详细说明:该类实现了java.lang包中的克隆接口Cloneable,并重写了克隆方法,如此一来外部就能够对本类的实例进行克隆操作,省去了由类而生的再造过程。 - 原型模式的类结构如下
3、工厂方法模式(Factory Method)
1、简单工厂:把实例化和初始化的过程包装在一起,并可分类创建实例,但不易于扩展
客户端调用:调用简单工厂类即可创建不同的实例;
2、工厂方法:定义一个统一的接口,以确立统一的工业制造标准,并且易于扩展;工厂方法模式能将客户端与产品的实例化过程彻底解耦,而且可以更灵活地制造独特而多样的产品。
飞机工厂类
坦克工厂类
客户端调用:通过实例工厂类创建实例
3、工厂方法的类结构
4、抽象工厂模式(Abstract Factory)
1、抽象工厂模式:工厂方法模式在需要创建的产品变多时容易造成工厂泛滥,抽象工厂就是将产品进行规划整合,对现有工厂进行重构;其本质类似于对产品进行分类,通过整合抽象的分类来聚焦具体的产品
产品结构图
兵种抽象类包含对兵种基础属性的描述
对兵种进行分类
创建人族具体兵种,分别扩展初级和中级兵种抽象类,兽族与人族类似
对生产线进行规划,创建统一的人类兵工厂
客户端调用
注意:这样看好像看不出来什么有什么好处,但对比工厂方法就知道了;假设我们要造3*3=9个兵种,使用工厂方法就需要使用九个具体兵种类并进行创建,但使用抽象工厂仅需要知道他们的分类,即兵种类别(人、兽、神)和兵种级别(初、中、高)即可创建;如果分类更多的话,抽象工厂就更能显现其好处
2、抽象工厂的类结构
抽象工厂通过“制造工厂的工厂”这样的方式,来决定具体让哪个工厂投入生产活动;