一、简单工厂(Simple Factory)
1、定义
提供一个创建对象实例的功能,而无需关心其具体的实现。被创建的实例类型可以是接口、抽象类,也可以是具体的类。
2、类图
- Api:定义客户所需要的功能接口
- Impl:具体实现Api的实现类,可能会有多个
- Factory:工厂,选择合适的实现类来创建Api接口对象
- Client:客户端,通过Factory去获取Api接口对象,然后面向Api接口编程
3、调用顺序
4、示例代码
创建接口实现工厂类客户端
5、何时选用简单工厂
1、如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体
2、如果想要把对外创建对象的职责集中管理和控制
二、工厂方法(Factory Method)
1、定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类
2、类图
- Product:定义工厂方法所创建的对象的接口,也就是实际需要使用的对象的接口。
- ConcreteProduct:具体的Product接口的实现对象。
- Creator:创建器,声明工厂方法,工厂方法通常会返回一个Product类型的实例对象,而且多是抽象方法。也可以在Creator里面提供工厂方法的默认实现,让工厂方法返回一个缺省的Product类型的实例对象。
- ConcreteCreator:具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例。
3、调用顺序
4、示例代码
对象接口具体对象创建器具体创建器
5、何时选用工厂方法模式
1、如果一个类需要创建某个接口的对象,但是又不知道具体的实现
2、如果一个类本身就希望,由它的子类来创建所需的对象的时候
三、抽象工厂(Abstract Factory)
1、定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类
2、类图
- AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口。
- ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
- AbstractProduct:定义一类产品对象的接口。
- ConcreteProduct:具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
- Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能。
3、调用顺序
4、示例代码
抽象共工厂接口抽象产品接口产品具体实现具体工厂实现客户端
5、何时选用抽象工厂模式
1、如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候。
2、如果一个系统要由多个产品系列中的一个来配置的时候,换句话说,就是可以动态的切换产品簇的时候。
3、如果要强调一系列相关产品的接口,以便联合使用它们的时候。
四、单例 (Singleton)
1、定义
保证一个类仅有一个实例,并提供一个全局访问点
2、类图
3、调用顺序
4、示例代码
5、何时选用单例模式
当需要控制一个类的实例只能有一个,而且客户只能从一个全局访问点访问它时,可以选用单例模式,这些功能恰好是单例模式要解决的问题。
五、生成器(Builder)
1、定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表现。
2、类图
- Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作。
- ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法。
- Director:指导者,也被称为导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象。
- Product:产品,表示被生成器构建的复杂对象,包含多个部件。
3、调用顺序
4、示例代码
生成器接口具体生成器实现对象产品指导者
5、何时选用生成器模式
1、如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时
2、如果同一个构建过程有着不同的表示时
六、原型模式(Prototype)
1、定义
用原型实例指定创建对象的种类,并通过拷贝这些原型实现创建新的对象。
2、类图
- Prototype:声明一个克隆自身的接口,用来约束想要克隆自己的类,要求它们都要实现这里定义的克隆方法。
- ConcretePrototype:实现Prototype接口的类,这些类真正实现了克隆自身的功能。
- Client:使用原型的客户端,首先要获取到原型实例对象,然后通过原型实例克隆自身来创建新的对象实例。
3、调用顺序
4、示例代码
克隆接口克隆的具体实现对象客户端
5、何时选用原型模式
1、如果一个系统想要独立于它想要使用的对象时,可以使用原型模式,让系统只面向接口编程,在系统需要新的对象的时候,可以通过克隆原型来得到
2、如果需要实例化的类是在运行时刻动态指定时,可以使用原型模式,通过克隆原型来得到需要的实例
6、浅度克隆和深度克隆
浅度克隆:只负责克隆按值传递的数据(比如:基本数据类型、String类型) 深度克隆:除了浅度克隆要克隆的值外,还负责克隆引用类型的数据,基本上就是被克隆实例所有的属性的数据都会被克隆出来。 深度克隆还有一个特点,如果被克隆的对象里面的属性数据是引用类型,也就是属性的类型也是对象,那么需要一直递归的克隆下去