设计模式—创建型

       创建型模式关注对象的创建过程,它将对象的创建和使用分离,在使用对象时无须知道对象的创建细节,使整个系统的设计更加符合单一职责原则,通俗的说它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。

创建性模式有五种:

1.工厂模式
    ①简单工厂模式(经常被用到,不属于GoF23种设计模式)
    ②工厂方法模式
    ③抽象工厂模式
2.建造者模式
3.原型模式
4.单例模式

  • 工厂模式

       工厂模式包括简单工厂、工厂方法、抽象工厂这 3 种细分模式。其中,简单工厂和工厂方法比较常用,抽象工厂的应用场景比较特殊,所以很少用到

       工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。实际上,如果创建对象的逻辑并不复杂,那我们直接通过 new 来创建对象就可以了,不需要使用工厂模式。当创建逻辑比较复杂,是一个“大工程”的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。

       当对象的创建逻辑比较复杂,不只是简单的new一下就可以,而是要组合其他类对象,做各种初始化操作的时候,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂,代码可读性差,维护困难。除此之外,如果工厂要返回多种不同的对象,为了避免大量的switch-case(或者if-else)逻辑判断我们也建议使用工厂方法模式

    如果对象的创建逻辑简单则推荐使用简单工厂即可

    而如果需要创建多个相关对象,则考虑使用抽象工厂模式,此模式一般实际中使用比较少

  • 建造者模式

       建造者模式用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。建造者模式的原理和实现比较简单。

        如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用性,我们可以通过构造函数配合set方法来解决。但是有时候set方法不能够很好地解决问题,例如以下几种情况我们就要考虑使用建造者模式了。

       ①如果类有很多必填的属性,强制在创建类的时候就要设置这些属性,这时候如果把这些属性都放在构造函数的参数列表中,会造成参数列表很长,如果使用set方法去设置,又无法保证参数必填的特性

       ②如果类的属性之间有一些依赖关系,或者约束的条件,使用构造函数或者set方法,会使得依赖关系,或者约束的条件的校验逻辑,没有地方写(set方法是不适合写校验逻辑的)

       ③如果希望创建的对象的属性不可改变,这时候我们不能暴露set方法,而对象的属性又比较多,这时候放在参数列表中不太合适

  • 原型模式

        如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型模式。

        原型模式有两种实现方法,深拷贝和浅拷贝。浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象,而深拷贝得到的是一份完完全全独立的对象。所以,深拷贝比起浅拷贝来说,更加耗时,更加耗内存空间。如果要拷贝的对象是不可变对象,浅拷贝共享不可变对象是没问题的,但对于可变对象来说,浅拷贝得到的对象和原始对象会共享部分数据,就有可能出现数据被修改的风险,也就变得复杂多了。操作非常耗时的情况下,我们比较推荐使用浅拷贝,否则,没有充分的理由,不要为了一点点的性能提升而使用浅拷贝。

  • 单例模式

单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。单例有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举

每种模式都有各自的优缺点和使用场景,我们应该根据实际情况考量,选择最合适的模式加以运用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值