设计模式-创建型模式

简单工厂模式

介绍

在简单工厂模式中,可以通过参数不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。

结构
  • Factory:工厂角色
  • ConcreteProduct:具体产品类
  • Product:抽象产品类
优点
  • 实现了对象创建的使用的分离
  • 客户端无需知道所创建的具体产品的类名,只需知道具体产品类所对应的参数即可
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体类,在一定程度上提高了系统的灵活性
缺点
  • 工厂类集中了所有产品的创建逻辑,职责过重,一单不能正常工作,整个系统都要受到影响
  • 增加系统中类的个数,增加了系统的复杂度和理解难度
  • 系统扩展困难,一旦添加新产品不得不修改工厂逻辑
  • 由于使用了静态工厂方法,造成了工厂角色无法形成继承基类的等级结构,工厂类不能得到很好的扩展

工厂方法模式

介绍

工厂父类负责创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。即通过工厂子类来确定具体应该实例化哪一个产品类

结构
优点
  • 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体类将被实例化这一细节
  • 能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节会完全封装到共产工厂内部
  • 在系统加入新产品时,完全符合开闭原则
缺点
  • 系统中类的个数成对增加,在一定程度上增加了系统的复杂度,会给系统带来额外的开销
  • 增加了系统的抽象性和理解难度

抽象工厂模式

介绍

产品等级结构,产品族。 提供一个创建一系列相互或相关依赖对象的接口,而无需指定他们具体的类

结构
优点
  • 隔离了具体类的生成,是的客户端并不需要知道什么被创建
  • 当一个产品族中的多个对象被设计成一起工作时,他能保证客户端始终只使用同一个产品族中的对象
  • 增加新的产品族很方便,无需修改已有系统,符合开闭原则
缺点
  • 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,违背了开闭原则

建造者模式

介绍

他用于创建一个包含多个组成部分的复杂对象,可以返回一个完整的产品对象给用户

结构
优点
  • 简产品与产品的建造过程解耦,是的相同的创建过程可以创建不同的产品对象
  • 可以很方便的替换具体建造者或者增加新的具体建造者,扩展方便,符合开闭原则
  • 可以更加精细的控制产品的创建过程
缺点
  • 如果产品之间差异性过大,不适合使用建造者模式
  • 如果产品内部变化复杂,可能会需要定义很多具体建造者来实现这种变化

原型模式

介绍

当需要创建大量相同或者相似的对象时,可以通过参数一个已有对象的复制获取更多的对象

结构
优点
  • 简化对象的创建过程,通过复制一个已有实例可以抬高新实例的创建效率
  • 扩展性好
  • 简化创建结构
  • 可以用深克隆的方式保存对象的状态
缺点
  • 需要为每一个类配备一个克隆方法,而且该方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则
  • 、在实现深克隆时需要编写较为复杂的代码

单例模式

介绍

通过单例模式确保系统中一个类只有一个实例

结构
优点
  • 提供了对唯一实例的受控访问
  • 可以节约系统资源,提高系统的性能
  • 允许可变数目的实例(多例类)
缺点
  • 扩展困难(缺少抽象层)
  • 单例类的职责过重
  • 由于自动回收垃圾机制,可能会导致共享的单例对象的状态丢失
相关推荐
秋野酱4 分钟前
基于springboot的母婴商城系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端
艾莉丝努力练剑9 分钟前
alarm系统调用的一次性原理揭秘
linux·运维·服务器·开发语言·网络·人工智能·学习
无籽西瓜a15 分钟前
【西瓜带你学设计模式 | 第二期-观察者模式】观察者模式——推模型与拉模型实现、优缺点与适用场景
java·后端·观察者模式·设计模式
探序基因19 分钟前
安装空间转录组分析软件-R包SPATA2的安装
开发语言·r语言
春日见30 分钟前
E2E自驾规控30讲:环境搭建
开发语言·驱动开发·matlab·docker·计算机外设
念何架构之路36 分钟前
Go语言表达式的求值顺序
开发语言·后端·golang
zihao_tom38 分钟前
Springboot-配置文件中敏感信息的加密:三种加密保护方法比较
java·spring boot·后端
程序员buddha39 分钟前
Java面试八股文框架篇
java·开发语言·面试
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Java的医药进出口交易系统设计与实现为例,包含答辩的问题和答案
java·开发语言
Touch&1 小时前
Windows11多个JDK版本(Java8、Java11、Java17、Java21)下载安装和切换
java·jdk·jdk多个版本切换