首页 > IT职业 > IT职场 > 5 大创建型设计模式总结,20 张图彻底掌握
来源:mikechen的互联网架构
设计模式是写出优秀程序的保障,与架构能力与阅读源码的能力息息相关,对程序员来说非常重要,非常值得深入学习。
设计模式是让面向对象保持结构良好的秘诀。可以说,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
前面,我们介绍了 7 大设计原则(41张图解、2万多字)。
今天我们详解设计模式的 5 种创建型模式。


创建型模式分为对象创建型、类创建型。
对象创建型:把类的创建推迟到另一个对象;
类创建型:将对象的创建推迟到子类中。

下面逐一详解。
单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类只有一个实例,并提供一个全局访问点以获取该实例。
单例模式的 UML 类图:

单例模式的特点:
单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。
单例模式的8种实现方式:

饿汉模式

懒汉模式

双重检查锁(Double-Checked Locking)

......
单例模式的完整解析,查看这篇:
美团一面:会单例模式吗,写个单例看看?
单例模式的定义
单例模式的使用原因
单例模式的 8 种实现方式
单例模式的 4 大应用场景
单例模式的优点、缺点
单例模式的选型参考思路

抽象工厂模式的构成:
抽象工厂(AbstractFactory):声明了用来创建不同产品的方法;
具体工厂(ConcreteFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建;
抽象产品(AbstractProduct):为每种产品声明业务方法;
具体产品(Product):定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。它同具体工厂之间是多对一的关系。
抽象工厂模式的实现 UML 图:

假设:
华为和小米生产的手机,分为两条产品线,一个是老人手机,一个是学生手机。
为了解决增加产品线的问题,我们用抽象工厂模式来实现。
源码示例:
......
抽象工厂模式的完整解析,查看这篇:
3分钟重温抽象工厂模式(电商高频使用)
工厂方法模式是 简单工厂模式 的进一步抽象和升级,使用频次也更高。
工厂方法模式实现了可扩展,同时满足开闭原则,解决了简单工厂模式每次添加新的产品时,都需要修改工厂类的问题。

工厂方法模式定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
工厂方法模式的特点:
构建的都是同一类型的对象(实现相同的接口);且每一类对象对应一个工厂。
工厂方法模式的结构:


Product:抽象产品类。
ConcreteProduct:具体产品类,实现Product接口。
Factory:抽象工厂类,该方法返回一个Product类型的对象。
ConcreteFactory:具体工厂类,返回ConcreteProduct实例。
......
工厂方法模式的完整解析,查看这篇:
【重温23种设计模式】之工厂方法模式

原型模式(Prototype Pattern)通过克隆现有对象来创建新对象,避免了频繁的对象实例化过程,属于创建型模式。
简单理解,就是定义一个原型对象作为创建其他对象的基础,通过克隆原型对象,我们可以创建多个具有相同属性和行为的新对象。
例如:
孙悟空有个十分牛逼的绝活儿,叫分身术,可以幻化出多个相同的孙悟空。这个幻化出的新的分身,和设计模式中的原型模式是相似的。

原型模式的 UML 类图:

原型模式的构成:
客户端(Client):使用具体原型类中的 clone() 方法,来复制新的对象。
抽象原型(Prototype):可以是抽象类或接口,规定了具体原型对象必须实现的 clone() 方法。
具体原型类(ConcretePrototype):实现抽象原型类的 clone() 方法,它是可被复制的对象。
原型模式的实现:
将名片拷贝到自己的名片库中,分别用深拷贝和浅拷贝来实现。
源码示例:
......
原型模式的完整解析,查看这篇:
重温23种设计模式(11):原型模式
建造者模式(builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
例如:我们要定制一台电脑,我们只需要确认配件品牌及型号,而不必知道组装电脑的这个过程。

建造者模式的 UML 类图:

建造者模式的 4 个重要角色:
建造者模式的应用场景:
@Overridepublic StringBuilder append(CharSequence s) { super.append(s);// 实现过程略 return this;}......
建造者模式的完整解析,查看这篇:
详解建造者模式(含图例、UML类图、源码示例等)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024922/viewspace-2996988/ ,如需转载,请注明出处,否则将追究法律责任。