《大话设计》——创建型模式

本文介绍了创建型设计模式,包括单例模式、工厂方法模式、建造者模式和抽象工厂模式等,探讨了它们如何帮助系统独立于对象的创建、组合和表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           这篇文章讲述的模式分类中的三大类型之一——创建型模式!创建型模式隐藏了这些类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的的是由抽象类所定义的接口。这样,创建型模式在创建了什么,谁创建它,它是怎么被创建的,以及何时创建这些方面提供了很大的灵活性。

  创建型模式存在的意义:创建型模式抽象了实例化的过程。它们帮助一个系统独立于如何创建,组合和表示它的那些对象。创建型模式都会将关于该系统使用哪些具体的类的信息封装起来。允许客户用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的,即在编译时指定,也可以是动态的,就是运行时再指定。


原型模式(prototype

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需指导任何创建的细节。

涉及的相关知识点:

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

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


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

通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

多线程时的单例:

lock语句:lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它一直等待(也就是被阻止),直到该对象被释放。 


静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例类(静态初始化的方式,类一加载就实例化的对象,所以要提前占用系统资源)。原先的单例模式处理方式是要在第一次被引用时,才会将自己实例化,被称为懒汉式单例类(面临着多线程访问的安全性问题,需要做双重锁定的处理来保证安全)。


工厂方法模式(factory method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。

工厂方法使一个类的实例化延迟到其子类。工厂方法模式实现是,客户端需要决定实例化哪一个工厂来实现运算雷,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。工厂方法克服了简单工厂违背开放—封闭原则的缺点,又保持了封装对象创建过程的优点。

简单工厂vs工厂方法:

它们都集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步的抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了他的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。


建造者模式(Builder:讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。又称“生成器模式”,如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到她们,而具体建造的过程和细节就不需知道了。

用途:

主要用于创建一些复杂的对象,这些对象内部构件间的建造顺序通常是稳定的,但对象内部的构件通常面临着复杂的变化。 

建造者模式是在当创建复杂对象的算法应该独立于该对的组成部分以及他们的装配方式时适用的模式。


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

 优点:

一是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,他只需要改变具体工厂即可使用不同的产品配置。

二是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。


评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值