设计模式之创建者模式

设计模式之创建者模式

工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTAoEiAk-1675655110614)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651303731.png)]

1、先构建一个工厂接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKw1Xj45-1675655050525)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651433907.png)]

2、然后加减乘除各建一个具体工厂去实现这个接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnAM1sZh-1675655050525)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651478303.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RX5jIw49-1675655050526)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651499174.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-goLw5qwO-1675655050526)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651503834.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFMveiOt-1675655050526)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651506674.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvHPKrb7-1675655050526)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651510141.png)]

3、在OperationFactory类中,可以是这样的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzUARM1v-1675655050527)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651525237.png)]

抽象工厂模式

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vIdwfUzB-1675655050527)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675652094101.png)]

具体例子:(例如不同品牌的手机、电脑)-----------------------------------------------------------------------------------------------

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BcsYoOhR-1675655050527)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651898850.png)]

IDepartment接口:用于客户端访问,解除与具体数据库访问的耦合。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04zBJwua-1675655050527)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651917657.png)]

SqlserverDepartment类:用于访问SQL Server的Department。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuHQcfMF-1675655050527)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651928584.png)]

AccessDepartment类:用于访问Access的Department。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rtN5g7Wf-1675655050528)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651938464.png)]

IFactory接口:定义一个创建访问Department表对象的抽象的工厂接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPnn7I86-1675655050528)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651946798.png)]

SqlServerFactory类:实现IFactory接口,并实例化SqlserverUser和 SqlserverDepartment。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NhPkshgR-1675655050528)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651954519.png)]

AccessFactory 类 : 实 现 IFactory 接 口 , 实 例 化 AccessUser 和 AccessDepartment。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Enid7D8o-1675655050528)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651967985.png)]

客户端代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-608mVGCj-1675655050528)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651984993.png)]

结果显示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HBrumjl-1675655050529)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675651993925.png)]

建造者模式

建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

img

以下情况建议使用建造者模式:

1、某个对象有复杂的内部结构,通常包含多个成员属性,而且属性是可选的。

2、相同的方法,不同的执行顺序,产生不同的对象或不同的运行结果。

3、当创建一个对象需要很多步骤时,适合使用建造者模式。

针对第一种情况,产品的属性过多时,我们可以采用链式构造去解决这样的问题,代码如下:

img

创建产品代码 :

img

建造者模式中,通常有如下4个角色:

1、Product 产品类,一般是多个部件组成的复杂对象,由具体建造者来创建其各个零部件。

通用代码如下: img

2、Builder 抽象建造者,包含创建产品各个子部件的抽象方法以及返回复杂产品的方法。

通用代码如下:

img

3、ConcreteBuilder 具体建造者,实现抽象 Builder 定义的所有方法,并且返回一个装配好的对象。

通用代码如下:

img

4、Director 指挥者,负责安排已有模块的顺序,然后调用 Builder 建造产品。

通用代码如下:

img

缺点

1、建造者模式所创建的产品对象一般组成部分相似,如果产品的内部变化复杂,需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

2、如果产品内部结构发生变化,建造者也要相应修改,有较大的维护成本。

模式扩展

1、建造者模式的简化,如果系统中只需要一个具体建造者的话,可以省略抽象建造者。此时指挥者角色也省略,让Builder类同时扮演指挥者与建造者。

2、在使用建造者模式的时候可以考虑一下模板方法模式,多了解设计模式的原理和优点,别孤立地思考一个模式。

原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4zy9JHLZ-1675655050531)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654002181.png)]

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。我们来看看基本的原型模式代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0bfsY4hH-1675655050531)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654052381.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oqd94BWD-1675655050531)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654063611.png)]

客户端代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQqqGo6N-1675655050531)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654074215.png)]

对于Java而言,那个原型抽象类Prototype 是用不着的,因为克隆实在是太常用了,所以Java提供了Cloneable接口,其 中就是唯一的一个方法clone(),这样你就只需要实现这个接口就可以完成 原型模式了。

浅复制与深复制

浅复制:被复制对象的 所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深复制:把引用对象的变量指向复制过的新对象,而 不是原有的被引用的对象。

深复制的实现例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2Tq9W5F-1675655050531)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654374062.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wih7CB2c-1675655050531)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654380171.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSesFbAA-1675655050532)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654388555.png)]

单例模式

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访 问它的全局访问点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fg5Uw8pe-1675655050532)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654624452.png)]

Singleton类,定义一个GetInstance操作,允许客户访问它的唯一实 例。GetInstance是一个静态方法,主要负责创建自己的唯一实例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGh5PuWG-1675655050532)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654637180.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRAGpCPf-1675655050532)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654642829.png)]

多线程时的单例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6pBZ8G0b-1675655050532)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654679652.png)]

双重锁定

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnXxFXxu-1675655050532)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654692143.png)]

静态初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZALuH3Dd-1675655050533)(C:\Users\npc234\AppData\Roaming\Typora\typora-user-images\1675654717142.png)]

由于这种静态初始化的方式是在自己被加 载时就将自己实例化,所以被形象地称之为饿汉式单例类,原先的单例模式 处理方式是要在第一次被引用时,才会将自己实例化,所以就被称为懒汉式单例类。

参考:大话设计模式–程杰
知乎:建造者模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值