建立型模式是new 的一种替代方式,能够将对象的建立与具体的类型进行分离
目前已经介绍了5种建立型设计模式(若是简单工厂算一种的话,那就是6种)
分别是:
简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式
简单工厂模式
静态工厂方法是一种最简单的建立的替代方法
基本上不涉及复杂的处理过程,可能执行的仅仅是包装、转换等
好比,一个静态方法,根据参数进行if else判断,或者switch选择进而肯定须要建立的对象类型
好比,Long内部的valueOf 接受不一样类型的参数,进而转换为Long类型对象
他能够是一个方法,也能够有多个静态方法
尽管一般简单工厂模式将只会建立一种类型的产品对象
可是,你也能够N个静态方法,建立N多种不一样类型的对象
不过通常不这么用,不够清晰,没有条理杂乱,彻底不符合单一职责原则
因此对于简单工厂模式,咱们通常说简单工厂模式只能建立一种类型的产品
简单工厂模式它的核心就是:
一个类 静态方法 来解决对象的建立问题
一个类吃遍天下
工厂方法模式
简单工厂模式一个类吃遍天下,职责过多,就会有各类缘由可能要修改这个类,比如你是两个班级的班主任,无论哪一个班级的学生有事情都要找你。
既不符合单一职责原则,也不符合开闭原则
因此为了解决这个问题,进化出来工厂方法模式
工厂方法模式再也不是一个类吃遍天下
工厂方法模式经过与产品等级结构相同的工厂等级结构,对产品进行建立
每一个工厂再也不是多个职责,仅仅建立一种类型的产品,符合单一职责
并且,对于新增的产品等级,只须要扩展工厂,而不须要修改现有的工厂
因此说工厂方法模式是简单工厂模式的标准版本,规范版本
工厂方法定义了一个用于建立对象的接口,他的子类(具体的工厂类)负责具体产品的建立
这个抽象的工厂角色并不知道他所建立的对象的具体类型,由于是子类决定了具体类型
将建立对象的职责委托给了多个子类中的一个,因此也说工厂方法模式将对象的建立延迟到其子类
好比
Creator creator = new ConcreteCreator();
Product product= creator.create();
客户端经过creator.create()得到产品
不用关心Creator具体的类型,也不知道Product具体的类型,都是面向抽象的编程
建立的产品的具体的类型彻底是动态的根据creator的具体的类型ConcreteCreator决定的
工厂方法模式虽然解决了简单工厂模式中的各类问题,进行了升级改良
可是
工厂模式只能建立一种类型的产品
由于工厂模式的顶级抽象角色规定了建立的协议
他只有一种返回类型
为了解决工厂方法只能建立一种类型的产品的弊端,又拓展出抽象工厂的模式
将工厂的建立能力拓展到产品族
也就是顶级的抽象角色中,能够建立一系列类型的产品
这一系列类型的产品中的一员(每种类型一个)就组成了一个产品族的概念
实际使用的时候,必定要注意,他们必需要有产品族的概念
若是你没有产品族的概念,非要生搬硬套的组织在一块儿,好比一个工厂生产轮胎和CPU和热水袋,他们之间使用时毫无关联,必然不会符合单一职责原则
有了产品族的概念,并且这一族产品也极可能一块儿出现使用,才是抽象工厂模式最好的运用
当一个系统要由多个产品系列中的一个来配置时,典型的就是相似厂家替换这种场景,很是适合抽象工厂
建造者模式
在有了可以生产一族产品的能力以后,好比能够生产 轮胎 发动机
那么,就会有应用这一族产品的需求
对于这一族产品的运用,又能够将他们使用逻辑,也就是装配逻辑进行分离,这个分离就是建造者模式
建造者模式仅仅关心构造一个完整复杂产品的步骤,而不关心生产细节
细节由具体的builder进行实现
builder就至关于抽象工厂模式中的Creator,只不过builder还要负责每个步骤的装配
建造者模式也一般借助于抽象工厂模式来进行实现,就是Creator也负责最终产品的组装交付
原型模式
原型模式相似与工厂模式
工厂模式是经过“建立” 来得到对象
而原型模式则是经过“复制”来得到对象
Java语言的机制---全部的类都继承自Object,使得Java自然的支持原型模式
只须要实现Cloneable接口便可,另外按照你的须要看是否实现clone方法
而对于稍微复杂点的原型模式下
好比建立的原型对象数量不固定或者产品种类较多,不方便管理,还出现了 带“管家”的原型模式
经过管理器这个管家对原型对象进行管理
他提供获取对象的方法
原型模式是另外一种视角的建立
单例模式
单例模式逻辑含义比较简单,就是有些场景就是须要惟一的对象,或者说有些场景不必使用多个对象。
保证类只有一个实例,并提供一个访问他的全局访问点
好比,原型模式中的管理器,除非特殊必要,不然他就应该是一个单例
再好比,windows的任务管理器
重点是实现的过程---如何保证的确只有一个对象被产生
这个全局惟一的访问点每每又是简单工厂模式---一个静态方法提供
对比、联系、区别
自己做为建立型模式,他们必然拥有相同的特征--“建立”对象,只不过是侧重点不一样
并且各类类型模式之间,很难不发生点关系
最基本的共性就是都是用来建立对象,都是new的替代方法
简单工厂、工厂方法、抽象工厂、建造者、原型都是建立对象
而单例除了第一次建立,其他时候都是返回一个已经存在的对象
建造者模式又特别关注比较复杂的对象
简单工厂模式、工厂方法模式、抽象工厂模式都是工厂模式的形态之一
工厂方法模式是简单工厂模式的规范化与标准化扩展
若是只有一个具体工厂类,工厂方法模式天然能够改形成简单工厂模式
抽象工厂模式是工厂模式中最为抽象和最具通常性的一种形态
抽象工厂常常经过工厂方法来实现
(也能够借助于原型模式来实现,抽象工厂能够存储一个被拷贝的原型对象的集合,而后返回产品的对象)
简单工厂模式和工厂方法模式都是针对一个产品等级结构,而抽象工厂则能够生产多个等级结构的产品
建造者模式与抽象工厂模式均可以用来建立同时属于几个产品族的对象,也就是他们均可以建立复杂的对象
可是建造者模式进一步的对组装过程进行了分离
抽象工厂模式中,每一次的工厂对象调用都会建立一个完整的产品对象
客户端来决定到底如何处理这些产品,能够组装为更大的产品,也可能不会
建造者模式则关注借助于产品族的各个产品,一点点的构造出一个更为复杂的产品
并且,产品的组装过程发生在建造者内部封装起来
建造者模式重点在于组装,复杂对象构建逻辑的分离
可是复杂对象的的每个组成部分每每又都是工厂模式建立
建立者模式与工厂模式常常结合使用
建造者模式在最后一步返回一个完整的产品(通常都是复杂的)
抽象工厂模式则是当即返回每个产品,具体的产品如何处理随便你
因此说,建造者模式是抽象工厂模式在某种场景下的一种延伸拓展
单例模式保证只有一个对象,它提供了一个静态方法用于获取这个惟一的对象
因此说,单例模式使用了简单工厂模式
不过提供工厂方法的这个类就是他自身,并且静态方法返回的对象也是他自身,是本身的工厂
单例模式与其余建立型模式并不冲突也不矛盾
其余模式中的对象,也能够是单例的
建立型模式之间是相互发展,相互借鉴的,结合具体的状况,适用于不一样的场合
工厂方法模式,抽象工厂模式是最基础的建立,以代替new 达到对象的建立与使用的隔离
建造者模式把产品组装为复杂的产品
原型模式是要求经过“复制”来建立,单例模式要求只能建立一个,是进一步的需求升级