设计模式之创建型模式

创建型模式

一、工厂方法模式

(一)定义:在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

(二)模式说明:在现实生活中社会分工越来越细,越来越专业化。各种产品有专门的工厂生产,这大大缩短了产品的生产周期,提高了生产效率。同样,在软件开发中做到软件对象的生产和使用相分离。其中将对象的生产单独封装成一个工厂,即为工厂方法模式

(三)构成要素:
在这里插入图片描述
(四)应用实例
用工厂方法模式设计畜牧场。
分析:有很多种类的畜牧场,如养马场用于养马,养牛场用于养牛,所以该实例用工厂方法模式比较适合。

对养马场和养牛场等具体工厂类,只要定义一个生成动物的方法 newAnimal() 即可。由于要显示马类和牛类等具体产品类的图像,所以它们的构造函数中用到了 JPanel、JLabd 和 ImageIcon 等组件,并定义一个 show() 方法来显示它们。

客户端程序通过对象生成器类 ReadXML2 读取 XML 配置文件中的数据来决定养马还是养牛。其结构图如图 2 所示。
在这里插入图片描述

二、抽象工厂模式

(一)定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。。抽象工厂更像是对工厂的工厂模式。

(二)模式说明:
工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族

(三)构成要素:

在这里插入图片描述
(四)应用案例
用抽象工厂模式设计农场类。
分析:农场中除了像畜牧场一样可以养动物,还可以培养植物,如养马、养牛、种菜、种水果等,所以本实例比前面介绍的畜牧场类复杂,必须用抽象工厂模式来实现。

本例用抽象工厂模式来设计两个农场,一个是韶关农场用于养牛和种菜,一个是上饶农场用于养马和种水果,可以在以上两个农场中定义一个生成动物的方法 newAnimal() 和一个培养植物的方法 newPlant()。

在这里插入图片描述

三、单例模式

(一)定义:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

(二)应用实例:保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个班级只有一个班主任。

(三)构成要素:
在这里插入图片描述

(四)单例分类:
1、懒汉式:
(1)线程不安全:普通版
(2)线程安全:在get方法上加上一把synchronized锁
2、饿汉式:
(1)普通版
(2)双重检测锁模式:属性上加volatile,类模板上加synchronized
在这里插入图片描述

(3)静态内部类:与双重检测锁的效果一致
在这里插入图片描述

(4)枚举:保证多线程安全并且防止反序列化破坏单例特性
在这里插入图片描述

四、建造者模式

(一)定义:将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一组成部分是可以灵活选择的。

(二)模式说明:生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、体型、服装、发型等特性都有所差异;还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封电子邮件的发件人、收件人、主题、内容、附件等内容也各不相同。

(三)构成要素:
在这里插入图片描述
(四)应用案例
用建造者(Builder)模式描述客厅装修。
分析:客厅装修是一个复杂的过程,它包含墙体的装修、电视机的选择、沙发的购买与布局等。客户把装修要求告诉项目经理,项目经理指挥装修工人一步步装修,最后完成整个客厅的装修与布局,所以本实例用建造者模式实现比较适合。

这里客厅是产品,包括墙、电视和沙发等组成部分。具体装修工人是具体建造者,他们负责装修与墙、电视和沙发的布局。项目经理是指挥者,他负责指挥装修工人进行装修。

在这里插入图片描述

五、原型模式

(一)定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。

(二)模式说明:在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效。

(三)构成要素:
在这里插入图片描述

(四)克隆类型:
1、浅克隆:克隆出来的对象属性是指向相同地址的,也就是说原对象属性的改变会造成克隆对象属性的改变
2、深克隆:克隆出来的对象属性不再是原来的对象属性,而是一个新的对象属性,指向另外一块物理地址
(1)序列化实现深克隆
(2)重写clone方法:要求在克隆对象的同时对属性进行克隆

(五)应用案例
用原型模式模拟“孙悟空”复制自己。
分析:孙悟空拔下猴毛轻轻一吹就变出很多孙悟空,这实际上是用到了原型模式。这里的孙悟空类 SunWukong 是具体原型类,而 Java 中的 Cloneable 接口是抽象原型类。
另外,重写了 Cloneable 接口的 clone() 方法,用于复制新的孙悟空。访问类可以通过调用孙悟空的 clone() 方法复制多个孙悟空
在这里插入图片描述






参考:

[1] 设计模式|菜鸟教程

[2] 软件设计模式概述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值