创建型模式

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成

一、单例模式

1. 概念
1)在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式

2)单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式
2. 特点
1)单例类只有一个实例对象

2)该单例对象必须由单例类自行创建

3)单例类对外提供一个访问该单例的全局访问点
3. 实现方法
1)通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例	

2)这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例

在这里插入图片描述

4. 饿汉式单例与懒汉式单例
1)懒汉式单例要加关键字 volatile 和 synchronized,否则将存在线程非安全的问题,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点

2)饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题
5. 应用场景
1)在应用场景中,某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等

2)当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等

3)当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等
6. 扩展
1)单例模式可扩展为有限的多例(Multitcm)模式,这种模式可生成有限个实例并保存在 ArmyList 中,客户需要时可随机获取	

二、原型模式

1. 概念
1)原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象

2)在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节

3)在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效

4)用原型模式除了可以生成相同的对象,还可以生成相似的对象
2. 模式结构
由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单

1)抽象原型类:规定了具体原型对象必须实现的接口

2)具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象

3)访问类:使用具体原型类中的 clone() 方法来复制新的对象	

在这里插入图片描述

3. 深克隆和浅克隆
1)原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类	

2)深克隆的过程是通过序列化来完成的,而序列化的过程可以将对象及所牵涉的所有引用链中的对象一起通过字节流的方式转移到特定的存储单元中(这个存储单元可以是内存也可以是硬盘,对于克隆通常是序列化至内存),再通过反序列化的过程读出这些序列化的字节流重构出对象,这样就完成了一个新对象的产生

3)而浅克隆不用序列化,这种克隆方式仅仅只是将指定的当前对象复制出来一个,这种复制过程不包括原对象引用的各个对象
4. 应用场景
1)对象之间相同或相似,即只是个别的几个属性不同的时候	

2)对象的创建过程比较麻烦,但复制比较简单的时候
5. 扩展
1)原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器 PrototypeManager 类。该类用 HashMap 保存多个复制的原型,Client 类可以通过管理器的 get(String id) 方法从中获取复制的原型	

三、工厂模式

1. 概念
1)工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点

2)我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”

3)本节介绍的“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则
2. 优缺点
1)优点

	(1)用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程

	(2)在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则

2)缺点

	(1)每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度
3. 模式结构
1)抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品

2)具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建	

3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能

4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应

在这里插入图片描述

4. 应用场景
1)客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等

2)创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口

3)客户不关心创建产品的细节,只关心产品的品牌
5. 拓展
1)当需要生成的产品不多且不会增加,一个具体工厂类就可以完成任务时,可删除抽象工厂类。这时工厂方法模式将退化到简单工厂模式

四、抽象工厂模式

1. 概念
1)抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同种类的产品(多个产品)的模式结构		

2)抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个种类的产品,而抽象工厂模式可生产多个种类的产品
2. 满足条件
1)系统中有多个产品族,每个具体工厂创建同一族但属于不同种类结构的产品	

2)系统一次只可能消费其中某一族(同一工厂)产品,即同族的产品一起使用
3. 优缺点
1)优点

	(1)可以在类的内部对产品族中相关联的多种类产品共同管理,而不必专门引入多个新的类来进行管理	

	(2)当增加一个新的产品族时不需要修改原代码,满足开闭原则

2)缺点

	(1)当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改	
4. 模式结构
1)抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同种类的产品

2)具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建

3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品

4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系

在这里插入图片描述

5. 应用场景
1)当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等

2)系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋

3)系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构	
6. 拓展
1)当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则

2)当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则

3)当系统中只存在一个种类结构的产品时,抽象工厂模式将退化到工厂方法模式

五、建造者模式

1. 概念
1)建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式

2)它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成

3)它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的
2. 优缺点
1)优点

	(1)各个具体的建造者相互独立,有利于系统的扩展

	(2)客户端不必知道产品内部组成的细节,便于控制细节风险

2)缺点

	(1)产品的组成部分必须相同,这限制了其使用范围

	(2)如果产品的内部变化复杂,该模式会增加很多的建造者类	

3)与工厂模式的区别

	(1)建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用
3. 模式的结构
1)产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件

2)抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()

3)具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法	

4)指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息

在这里插入图片描述

4. 应用场景
1)创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的

2)创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的
5. 拓展
1)建造者(Builder)模式在应用过程中可以根据需要改变,如果创建的产品种类只有一种,只需要一个具体建造者,这时可以省略掉抽象建造者,甚至可以省略掉指挥者角色	

参考网址

创建型模式的特点和分类

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值