模式定义 优缺点 使用场景的对比

名字

定义

优点

缺点

适用场景

简单工厂模式

定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

1.分离职责:简单工厂模式实现了对象创建以及使用的分离,工厂类包含必要的判断逻辑。

2.简化记忆:客户端无须知道具体产品类的名字,只需要知道对应的参数即可。辑,

3.提高灵活性:可以引入配置文件在不修改客户端代码情况下增加新的具体产品类,

1.工厂职责过重:工厂类集中了所有产品的创建逻辑,

2.复杂度增加:由于引入了工厂类会增加系统中类的个数,

  1. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑
  2. 无法继承:简单工厂模式使用了静态工厂方法
  1. 工厂类负责创建的对象比较少
  2. 客户端只需要知道传入工厂类的参数,对如何创建对象不关心

工厂方法模式

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。

  1. 封装细节:工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,
  2. 多态:工厂方法的多态性能够让工厂可以自主确定创建何种产品对象。
  3. 扩展性好:完全符合开闭原则。
  1. 类数量多
  2. 增加理解难度:基于系统的扩展性和客户端中均使用了抽象层的定义,增加了系统的抽象性以及理解难度。
  1. 一个类不知道它所需要的对象的类,
  2. 一个类通过其子类来指定创建哪个对象
  3. 将创建对象的任务委托给多个工厂子类中的某一个,

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

  1. 抽象工厂模式隔离了具体类的生成,实现高耦合低内聚。
  2. 保证客户端始终只使用同一个产品族中的对象。
  3. 增加新的产品族和工厂容易(单从这一点符合OCP)
  4. 易于交换产品系列
  1. 开闭原则的倾斜性

(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

  1. 难以扩展抽象工厂来生产新种类的产品,

1.对于所有类型的工厂模式都是重要的。

2、系统中有多于一个的产品族

3.属于同一个产品族的产品将在一起使用,

4.系统提供一个产品类的库,所有的产品以同样的接口出现,

建造者模式

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  1. 封装细节:客户端不需要知道产品内部组成细节。
  2. 扩展性好:每一个具体建造者都相对独立。
  3. 精细地控制创建过程。
  4. 针对抽象建造者编程,符合开闭原则。
  1. 范围受限:如果产品之间的差异性很大,就不适合使用建造者模式,
  2. 建造者多:如果产品内部结构复杂多变,可能会需要定义很多具体建造者
  1. 产品对象有复杂的内部结构
  2. 品对象的属性相互依赖,需要指定其生成顺序
  3. 创建过程独立于创建该对象的类。
  4. 隔离复杂对象的创建与使用,并使得相同的创建过程可以创建不同的产品。

原型模式

使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的对象。

1、当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。

2、可以动态增加或减少产品类。

3、原型模式提供了简化的创建结构。

4、可以使用深克隆的方式保存对象的状态。

1、对已有的类进行改造的时候,需要修改源代码,违背了OCP(开放闭合原则)

2、在实现深克隆时需要编写较为复杂的代码。

1、创建新对象成本较大,

2、如果系统要保存对象的状态,而对象的变化状态很小,

3、需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,

单例模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。

  1. 提供了对唯一实例的受控访问。
  2. 可以节约系统资源
  3. 允许可变数目的实例。
  1. 于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
  2. 单例类的职责过重,在一定程度上违背了“单一职责原则”
  3. 滥用单例将带来一些负面问题,如
  1. 系统只需要一个实例对象,
  2. 客户调用类的单个实例只允许使用一个公共访问点,
  3. 要求一个类只有一个实例时才应当使用单例模式。改进成为多例模式

适配器模式

将一个接口转换为客户希望的另一个接口,使接口不兼容的那些类可以一起工作,别名为包装器。

1.将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。

2.增加了类的透明性和复用性,

3.通过使用配置文件,可以很方便地更换适配器,符合“开闭原则”

【类适配器】

优点:可在适配器类中置换一些适配者的方法。

缺点:一次最多只能适配一个适配者类

【对象适配器】

优点:把多个不同的适配者适配到同一个目标

缺点:要想置换适配者类的方法就不容易

1、系统需要使用现有的类,而这些类的接口不符合系统的需要。

2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

桥接模式

将抽象部分与其实现部分分离,使它们都可以独立地变化。

  1. 分离抽象接口及其实现部分。
  2. 桥接模式是比多继承方案更好的解决方法。
  3. 在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  4. 实现细节对客户透明,
  1. 增加理解难度:桥接模式会增加系统的理解以及设计难度
  2. 需要正确识别抽象层:桥接模式要求正确识别系统中两个独立变化的维度,

1.一个系统需要在抽象类和具体类之间增加更多的灵活性,通过桥接模式可以使它们在抽象层建立一个关联关系

2.抽象部分和实现部分可以以继承的方式独立扩展而互不影响,

3.一个类存在两个(或多个)独立变化的维度,

组合模式

组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。

1、层次控制:增加新构件也更容易

2、一致使用构件:客户端调用简单。

3、扩展性好:更容易在组合体内加入对象构件,符合开闭原则

4、有效针对复杂树形结构。

1、使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联。

2、增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制。

1.具有整体和部分的层次结构中希望通过一种方式忽略整体与部分的差异,客户端可一致性对待它们

 2、处理树形结构,让客户能够忽略不同对象层次的变化,

 3、对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。

装饰模式

动态地给对象增加一些额外的职责。

1、动态扩展灵活:比继承更多的灵活性。

2、多次装饰:可以创造出很多不同行为的组合。

3、构件与装饰类独立变化:具体构件类以及具体装饰类可以独立变化,符合开闭原则

(1)对象较多:使用装饰类和小对象的产生将增加系统的复杂度。

(2)排查繁琐:比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

1、动态和透明的方式给单个对象增加职责

2、需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。

3、在不能采用继承扩展系统或者采用继承不利于对系统扩展和维护时可以使用装饰模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值