设计模式——创建型模式


关注点:”怎样创建对象“,将对象创建与使用分离,降低系统耦合度。


单例(Singleton)模式:
某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
实现思路:
如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。
这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
单例模式 3 个特点:
单例类只有一个实例对象;
该单例对象必须由单例类自行创建;
单例类对外提供一个访问该单例的全局访问点;
结构:
单例类、访问类static final volatile synchronized
两种方式:
1.懒汉式:第一次调用时,才创建这个单例。(若是多线程程序,volatile 和 synchronized关键字不可删除,以保证线程安全。)
2.饿汉式:类一旦加载,就创建一个实例。 static final ,类创建时,就生成了静态对象,故【线程安全】。
应用场景:
1.某类只要求生成一个对象的时候、身份证号。
2.对象需要被共享。 Web 中的配置对象、数据库的连接池。
3.当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,多线程的线程池、网络线程池。


原型(Prototype)模式:
将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
结构:
1.抽象原型类:规定了具体原型对象必须实现的接口。
2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
3.访问类:使用具体原型类中的 clone() 方法来复制新的对象。
实现:
1.实现Cloneable 接口,调用clone()就可以进行浅拷贝。【浅拷贝只能拷贝基本类型】
2.实现深拷贝:
a.实现Cloneable接口的类中引用成员,都需要实现Cloneable 接口。
b.通过实现序列化接口Serializable相关操作。
c.实现序列化后,通过相关的工具类,如BeanUtils.CopyProperties等
应用场景:
对象之间比较相似,即只是个别的几个属性不同的时候。


工厂方法(FactoryMethod)模式:
定义一个用于创建产品的接口,由子类决定生产什么产品。
结构:
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间【一对一】关系。
应用场景:
客户只知道创建产品的工厂名,而不知道具体的产品名。
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
客户不关心创建产品的细节,只关心产品的品牌。


抽象工厂(AbstractFactory)模式:
提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
【抽象工厂模式是工厂方法模式的升级版本】,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
结构:
抽象工厂(Abstract Factory):基本同工厂模式,可以创建多个产品。
具体工厂(Concrete Factory):基本同工厂模式,可以创建多个抽象方法。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是【多对一】的关系。
应用场景:
当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。


建造者(Builder)模式:
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
结构:
产品角色(Product):包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
抽象建造者(Builder):包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
应用场景:
创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。如:人体构造、房屋装修。
创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

参考链接: 创建型设计模式:http://c.biancheng.net/view/1335.html;
参考链接: 序列化:https://www.cnblogs.com/9dragon/p/10901448.html;

posted @ 2021-02-18 23:15  对月当歌  阅读(79)  评论(0)    收藏  举报