设计模式——创建型模式

《大话设计模式》总结
其它参考链接:https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/creational.html

五种创建型模式: 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

编外:
(1)简单工厂模式, 工厂类中包含了必要的逻辑判断,根据客户端的条件动态 实例化相关的类。对于客户端来说,去除了与具体产品的依赖。
(2)所有在用简单工厂的地方,可以考虑用反射技术来去除switch 或if ,解除分支判断带来的耦合。 还有些配置更改可以考虑用配置文件来解决
(3) 依赖——注入的概念。

一、工厂方法模式
简单工厂需要增加内容时,是要更改原有的工厂类的(对修改开放了)。 这相当于违背了开放——封闭原则。
工厂方法模式是定义一个用于 创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品
在这里插入图片描述

使用工厂方法是需要把逻辑判断放在客户端,客户端根据需要选择用给抽象工厂赋值具体的工厂方法来实例化具体的产品。
在这里插入图片描述

实例:日志记录器
某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式, 现使用工厂方法模式设计该系统。

二、抽象工厂模式

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。
在这里插入图片描述

如图,一个抽象工厂可以生产不同产品结构的产品,而工厂方法模式中具有单一性。

应用抽象工厂模式可以实现高内聚低耦合的设计目的。 只需更改一个具体工厂,就能改变其中好几类产品行为。 它适用于一个产品族的多个对象一起工作时。
适用场景: 系统中有多于一个的产品族,每次使用其中某一产品族。 所有产品具有同样的接口。 例如数据库, A 数据库中的多种接口, B数据库中的多种接口。 而抽象工厂是抽象数据库。

缺点: 增加新的具体工厂和产品族容易,(符合开闭原则) 增加新的产品等级结构比较麻烦, 这涉及到对抽象工厂角色及其所有子类进行扩展(这个不能很好地支持开闭原则)。

三、建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者返还给客户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式,这就是建造者模式的模式动机
在这里插入图片描述

建造者模式的结构中还引入了一个指挥者类Director,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象
在客户端代码中,无须关心产品对象的具体组装过程,只需确定具体建造者的类型即可,建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现
建造者模式适用情况包括:需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;需要生成的产品对象的属性相互依赖,需要指定其生成顺序;对象的创建过程独立于创建该对象的类;

四、原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
在这里插入图片描述
在这里插入图片描述
在这个模式中,需要注意的是深拷贝与浅拷贝的问题。

五、单例模式
单例模式确保一个类只有一个实例。 这必须自行创建这个实例,然后自行向整个系统提供这个实例。
确保自行创建 ,将构造函数私有化。
提供实例,提供public 的 GetInstance()方法。
有两种方式:懒汉式、饿汉式

在懒汉式单例模式中,多线程访问时, 需要加锁来防止GetInstance创建多个实例。
要用双重锁定
if (instance == NULL)
{
lock.
{
if(instance == NULL)
{
instance = new Singleton();
}
}
}

这样一是可以避免每次调用GetInstance()方法都加锁,二是当多个线程同时经过第一重判断时,只有一个线程能获得锁并创建实例,等其它线程获取到锁时实例已经创建,它们不会再创建多余的实例。

饿汉式在加载时就通过静态初始化将自己实例化,然后作为全局访问点提供给外部使用。 但这种方式要防止派生。 派生可能会增加实例。

饿汉式要提前占用系统资源。
而懒汉式面临多线程访问的安全性问题,需要双重锁定技术来保证线程安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值