设计模式的基本原则

设计模式体现的是软件设计的思想,而不是软件技术,它重在使用多态与抽象类来解决各种问题

  • 开放封闭原则:类的改动是通过增加代码进行的,而不是修改源代码
  • 依赖倒置原则:依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程
  • 接口隔离原则:不应该强迫客户的程序依赖他们不需要的接口方法。一个接口应该只提供一种对外功能
  • 里氏替换原则:任何抽象类出现的地方都可以用他的实现类进行替换。实际就是虚拟机制,语言级别实现面向对象功能。
  • 合成复用原则:如果使用继承,会导致父类的任何变换都可能影响到子类的行为。如果使用对象组合,就降低了这种依赖关系
  • 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用

设计模式的分类(创建者模型)

通常和对象的创建有关,涉及到对象实例化的方式。(共5种模式)

1、单例模式(Singleton Pattern)是保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2、工厂方法模式(Factory Method Pattern)的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
3、抽象工厂模式(Abstract Factory Pattern)的意图是提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类。
4、建造者模式(Builder Pattern)的意图是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
5、原型模式(Prototype Pattern)是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

创建者模型

1、单例模式:

作用:保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象
构造图如下:

为什么需要单例模式:
1、在多个线程之间,比如初始化一次socket资源
2、在整个程序空间使用全局变量,共享资源
3、大规模系统中,为了性能的考虑,需要节省对象的创建时间
实现步骤:
1、构造函数私有化
2、提供一个全局的静态方法(全局访问点)
3、在类中定义一个静态指针,指向本类的变量的静态变量指针
单例模式分类及实现

  • 懒汉式
  • 饿汉式

2.1、简单工厂模式

静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

模式中包含的角色及其职责

1.工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象

简单工厂模式的优缺点
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

2.2、工厂模式

概念:

工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

模式中包含的角色及其职责:

抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
抽象(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
工厂方法模式所创建的具体实例对象

工厂模式和简单工厂模式的比较:

工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。

3、抽象工厂模式

概念:

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

模式中包含的角色及其职责:

  • 抽象工厂(Creator)角色
    抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
  • 具体工厂( Concrete Creator)角色
    具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
  • 抽象(Product)角色
    抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  • 具体产品(Concrete Product)角色
    抽象模式所创建的具体实例对象

三种工厂模式的区别:

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

4、建造者模式

概念:

Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。
1)由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
2)目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
3)根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

模式中包含的角色及其职责:

适用情况:
一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。

建造者模式和工厂模式的区别:

Factory模式中:
1、有一个抽象的工厂。
2、实现一个具体的工厂—汽车工厂。
3、工厂生产汽车A,得到汽车产品A。
4、工厂生产汽车B,得到汽车产品B。
这样做,实现了购买者和生产线的隔离。强调的是结果。
Builder模式:
1、引擎工厂生产引擎产品,得到汽车部件A。
2、轮胎工厂生产轮子产品,得到汽车部件B。
3、底盘工厂生产车身产品,得到汽车部件C。
4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
5、将这个整体送到汽车组装工厂,得到一个汽车产品。
这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程
两者的区别在于:
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
Factory模式所解决的问题是,工厂生产产品。
而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。

5、原型模式

概念:

Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。
1)由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
2)目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
3)根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

模式中包含的角色及其职责:

适用情况:
个复杂对象,具有自我复制功能,统一一套接口

设计模式之创建者模式相关推荐

  1. 设计模式系列-创建者模式

    为什么80%的码农都做不了架构师?>>>    一.上篇回顾 上篇我们主要讲述了抽象工厂模式和工厂模式.并且分析了该模式的应用场景和一些优缺点,并且给出了一些实现的思路和方案,我们现 ...

  2. 【设计模式】创建者模式(单例工厂原型建造者)

    文章目录 1.单例设计模式 1.1 单例模式概述 1.2 单例模式的实现 1.2.1 饿汉式(静态变量方式) 1.2.2 饿汉式(静态代码块方式) 1.2.3 懒汉式(线程不安全) 1.2.4 懒汉式 ...

  3. java设计模式-Builder创建者模式

    问题分析: Builder模式是一步一步创建一个复杂对象的创建型模式.该模式是为了将构建复杂对象的过程和他的部件解耦,使得构建过程和部件的表示隔离开来. Builder模式 主要用于"构建一 ...

  4. java 创建者设计模式_Java设计模式之创建者模式分享热爱编程,程序人生

    PS:今天的23中设计模式中的创建者方式,至此告一段落.我今天带来的技术分享为创建者模式以及原型模式.当然在Java中这两种方式很常见,只不过我们写的次数确实有点低而已,但是这不是我不学它的借口!!! ...

  5. Java设计模式之创建者模式

    1 简介 在最近看的一篇文章中,提到了关于新年目标制定的方式的实践,觉得不错,附在上图.尤其是目标一定要符合SMART模式, 为了-,通过-,截止-前,实现- 这个句式很有力量. 在日常编程实践中,对 ...

  6. 【设计模式】 - 创建者模式 - 工厂方法模式、抽象工程模式

    工厂方法模式.抽象工程模式 前言 工厂方法模式. 抽象工程模式 1. 简单工厂模式(不属于GOF的23种经典设计模式) 1.1 结构 1.2 实现 缺点 2. 工厂方法模式 2.1 结构 2.2 实现 ...

  7. JavaScript 设计模式 : 巧用'工厂模式'和'创建者'模式

    我为什么把他们两个放在一起讲?我觉得这两个设计模式有相似之处,有时候会一个设计模式不能满足你的需求而采用另一种设计模式.基于这点考虑,而且为了大家更好地理解,我放到了一起,加深大家的印象,活学活用. ...

  8. 设计模式-创建者模式篇

    设计模式 目录: 一.单例模式 二.工厂模式 三.抽象工厂模式 四.原型模式 五.建造者模式 注:学习视频:黑马程序员Java设计模式 创建者模式 创建型模式的主要关注点是"怎样创建对象?& ...

  9. 重学Java设计模式-创建者模式-工厂方法模式

    重学Java设计模式-创建者模式-工厂方法模式 内容摘自:重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」 | bugstack 虫洞栈 工厂方法模式介绍 图片 ...

最新文章

  1. SpringMVC项目前台利用ajaxFileUpload传递图片后台接收
  2. 转 linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值
  3. 研究人员研发可自我修复的“电子皮肤”,重点是还能回收再利用
  4. ArcEngine读取数据(数据访问)-转载
  5. malloc 和 calloc的区别?
  6. win7变成xp风格了怎么改回_XP退役了,如何把Win7变成XP风格
  7. 百度优化有感,原创内容只是个传说
  8. 第2章 python入门
  9. php 连接 sqlserver
  10. 转:10+年程序员总结的20+条经验教训
  11. 登录tomcat服务器首页直接跳转到项目
  12. 显示菜单栏_mac菜单栏不显示了,如何设置?
  13. 安卓10自带录屏_荣耀v10怎么录屏?荣耀v10三种录屏方法
  14. dotnet core error 0x80070057
  15. matlab画s域零极点图,信号与系统的S域分析.ppt
  16. Windows登录日志详解
  17. python保存Excel文件sheet_name是中文时出错:UnicodeDecodeError
  18. Linux 命令学习 -重置root密码
  19. 2022-2023 ICPC Brazil Subregional Programming Contest
  20. 常用的数据分析方法都有哪些(一)

热门文章

  1. java服务器和linux_在Linux下开一个Java服务器(使用CatServer Pro)
  2. 解决ckeditor富文本在layui 弹框中大小字体等下拉不显示
  3. Android入门(13)| Android权限 与 内容提供器
  4. leetcode551. 学生出勤记录 I
  5. 动态规划基础水题提纲
  6. dp打开思路2:POJ2533 HDU1114 HDU1260 HDU1160(水题不水)
  7. PRML(4)--Chapter2(下)-非参数估计
  8. 计算机基础知识整理 手抄报,科技小制作的手抄报资料简单字少
  9. boost::interprocess::named_mutex的翻译和学习
  10. codeforces 705A-C语言解题报告