设计模式-创建型

一、简单工厂(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类型) 深度克隆:除了浅度克隆要克隆的值外,还负责克隆引用类型的数据,基本上就是被克隆实例所有的属性的数据都会被克隆出来。 深度克隆还有一个特点,如果被克隆的对象里面的属性数据是引用类型,也就是属性的类型也是对象,那么需要一直递归的克隆下去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值