设计者模式

一、 定义:

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

二、 基本要素:

(1)模式名称 (Pattern name)
(2)问题 (Problem)
(3)解决方案 (Solution)
(4)效果 (Consequences)

三、 分类:

根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种:
(1)创建型模式:主要用于创建对象。
(2)结构型模式:主要用于处理类或对象的组合。
(3)行为型模式:主要用于描述对类或对象怎样交互和怎样分配职责。
根据范围,即模式主要是用于处理类之间关系还是处理对象之间的关系,可分为类模式和对象模式两种:
(1)类模式:处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是属于静态的。
(2)对象模式:处理对象间的关系,这些关系在运行时刻变化,更具动态性。

范围\目的创建型模式结构型模式行为型模式
类模式工厂方法模式(类)适配器模式解释器模式
模板方法模式
对象模式抽象工厂模式
建造者模式
原型模式
单例模式
(对象)适配器模式
桥接模式
组合模式
装饰模式
外观模式
享元模式
代理模式
职责链模式
命令模式
迭代器模式
中介者模式
备忘录模式
观察者模式
状态模式
策略模式
访问者模式

四、 创建型设计模式

创建型设计模式对类的实例化进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
(1) Factory Method(工厂方法)
1) 概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
2) 结构:
在这里插入图片描述

Product:抽象产品,定义工厂方法所创建的对象的接口
ConcreteProduct:具体产品,实现Produnct接口
Factory:抽象工厂,声明工厂方法,该方法返回一个Product类型的对象。
ConcreteFactory:具体工厂,重定义工厂方法以返回一个ConcreteProduct实例。
3)优点:
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
4)缺点:
在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度
5)适用性:
a、当一个类不知道它所必须创建的对象的类的时候
b、当一个类希望它的子类来指定它所创建的对象的时候
c、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
(2) Abstract Factory(抽象工厂)
1)概念:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体的类,抽象工厂模式又称Kit模式
2)结构:
在这里插入图片描述

Factory:抽象工厂,声明一个创建抽象产品对象的接口。
ConcreteFactory:具体工厂,实现创建具体产品对象的操作。
AbstractProduct:抽象产品,为一类产品对象声明一个接口。
ConcreteProduct:具体产品,定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口。
Client:仅使用由Factory和AbstractProduct类声明的接口。
3)优点:
a、只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
b、在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。
4)缺点:
在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品。
5)适用性:
a、一个系统要独立于它的产品的创建、组合和表示时
b、一个系统要由多个产品系列中的一个来配置时,即有多于一个的产品族,而每次只使用其中某一产品族时
c、当要强调一系列相关的产品对象的设计以便进行联合使用时,即属于同一个产品族的产品将在一起使用时
d、当提供一个产品类库,只想显示它们的接口而不是实现时
(3) Singleton(单例)
1) 概念:保证一个类仅有一个实例,而且自行实例化并向整个系统提供这个实例,即提供一个访问它的全局访问点,易于被访问
2) 结构:
在这里插入图片描述

Singleton:单例,指定一个instance操作,允许客户访问它的唯一实例,Instance是一个类操作,负责创建它的唯一实例。
单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化它,除此之外,该模式中包含一个静态私有成员变量与静态公有的工厂方法,该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
3) 优点:
a、提供了对唯一实例的受控访问
b、由于在系统内存中只存在一个对象,因此可以节约系统资源
c、允许可变数目的实例。我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例。
4) 缺点:
a、 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难
b、 单例类的职责过重
5) 适用性:
a、 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
b、 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时

(4) Builder(生成器、建造者)
1)概念:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2)结构:
在这里插入图片描述

Builder:抽象建造者,为创建一个Product对象的各个部件指定抽象接口
ConcreteBuilder:具体建造者,实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口
Director:指挥者,构造一个使用Builder接口的对象,一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程
Product:产品角色,表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。
3)优点:
a、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
b、用户使用不同的具体建造者即可得到不同的产品对象
c、可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
d、增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
4)缺点:
a、如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
b、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
5)适应性:
a、需要生成的产品对象有复杂的内部结构
b、需要生成的产品对象的属性相互依赖,需要指定其生成顺序
c、对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
d、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
(5) Prototype(原型)
1)概念:
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。通常情况下,一个类包含一些成员对象,在使用原型模式克隆对象时,根据其成员对象是否也克隆,原型模式可以分为两种形式:深克隆和浅克隆
2)结构:
在这里插入图片描述

Prototype:抽象原型类,声明一个复制自身的接口
ConcretePrototype:具体原型类,实现一个复制自身的操作
Client:客户类,让一个原型复制自身从而创建一个新的对象
3)优点:
a、当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率
b、可以动态增加或减少产品类
c、原型模式提供了简化的创建结构
d、可以使用深克隆的方式保存对象的状态
4)缺点:
a、需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。
b、在实现深克隆时需要编写较为复杂的代码。
5)适用性:
a、创建新对象成本较大时
b、需要避免使用分层次的工厂类来创建分层次的对象,并且一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化改类更方便一些
c、如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。
d、当要实例化的类是在运行时刻指定时,例如,通过动态装载。
e、当一个系统应该独立于它的产品创建、构成、表示时
(6) 创建型模式的比较
用于系统创建的那些对象的类对系统进行参数化有两种常用的方法:生成创建对象的类的子类和对系统进行参数化的方法。
生成创建对象的类的子类:Factory Method模式,其主要缺点是仅为了改变产品类就可能需要创建一个新的子类,这种改变可能级联发生。
对系统进行参数化:依赖于对象的复合,定义一个对象负责明确产品对象的类,并将它作为该系统的参数。这是Abstract Factory、Builder、Prototype模式的关键特征。都涉及创建一个新的负责创建产品对象的“工厂对象”。Abstract Factory由这个工厂对象产生多个对象、Builder由这个工厂对象使用一个相对复杂的协议,逐步创建一个复杂的产品、Prototype由该工厂对象通过复制原型对象来创建产品对象,在这种情况下,由于原型负责返回产品对象,所以工厂对象和原型是一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值