此笔记是在软件秘笈-设计模式那点事上做的笔记
一.工厂方法模式
1.开-闭 原则
指一个软件实体应对扩展开开放,对修改关闭。在设计一个软件模块的时候应该使这个模块可以在不被修改的前提下被扩展
优势:
(1)通过已有系统扩展自身的行为,从而满足新的软件需求,具有一定的适应性和灵活性
(2)原有的软件系统逻辑不被修改,保证了原系统和新系统的稳定性
2.依赖倒置原则
不要让高层组件依赖低层组件,更不能依赖具体实现类,都要依赖于抽象。针对于接口编程,而不是针对于实现编程。降低了客户程序与实现细节的耦合度。
3.在工厂方法模式中,存在几个角色
(1)抽象工厂
(2)抽象产品
(3)具体工厂
(4)具体产品
抽象工厂生产抽象产品,具体工厂(实现抽象工厂)生产具体产品(继承或实现抽象产品)。抽象对具体
4.jdk中的工厂方法模式
java.util.List java.util.LinkerList java.util.ArrayList
ArrayList实现了List中的iterator()方法
List<String> a=new ArrayList<>();
5.使用场合
(1)当子类型可能会很多,需要不断添加
(2)当一个系统尚在框架设计阶段,还不知道具体实例化哪些类
(3)系统设计之初不需要具体对象的概念
二.抽象工厂模式
使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可。例:肯德基点餐
1.抽象
类似于工厂方法模式的开闭和依赖倒置,使用抽象
设计原则
2.多用对象组合,少用集成
就是让对象作为类的成员变量,通过构造函数或者set方法给类对象的实例变量赋值。抽象工厂模式告诉我们要多用对象组合,少用继承
3.针对抽象编程,不针对实现编程
尽可能对系统中出现的各种事物抽象,从而建立基础的抽象底层,这样做使软件结构更加框架化,系统化,系统结构更加灵活,易维护,易拓展。
4.产品对象通过工厂暴露的方法创建
高内聚,低耦合。尽量避免过多的出现new关键字,抽象工厂模式对于对象解耦方面是显而易见的,在客户类,没有使用创建对象实例的语句,而是通过抽象工厂暴露的方法来获取对象实例,创建具体对象实例的工作都是具体工厂中实现的
例:薯条基类
public abstract class FrenchFries extents AbstractBaseFood implements IFood
继承了食物基类,实现了点餐接口,自己还是抽象的
5.使用场合
(1)创建产品家族,相关产品集合在一起使用的时候
(2)想要提供一个产品类库,并只想显示其接口而不是实现时
(3)通过组合的方式使用工厂时
6.工厂和抽象工厂的比较
联系:都是解耦,都是工厂模式。工厂是用来创建一个产品,抽象工厂是用来创建一个产品家族。
7.jdk中的使用
java.sql.DriverManager(数据库:Statement,PreparedStatement)
java.net.URL
java.lang.management.ManagementFactory
三.建造者模式
1.建造者模式将复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示。
指导者(接口)建造者(实现类,实现一个接口,不同的实现类)
2.设计原则
(1)分步骤创建复杂对象要使系统功能专业而单一,降低对象与对象之间,各个功能模块之间的依赖和耦合。每个功能简单即可
(2)构建和表示分离。构建的部分实现比较灵活,外部需求变化比较大,但是获取实例对象的过程是统一的,也就是说无论外部存在多少需求,变化,斗不过是对象的表现形式不同
(3)单一职责原则。每个信息中实现不同的功能(例如手机套餐)然后试用一个统一的接口获得手机套餐实例。
3.使用场合
(1)当生成的对象产品内部对象具有复杂结构时
(2)当复杂对象需要与表示分离,可能需要创建不同的表示时
(3)当需要向客户隐藏产品内部结构的表现时
4.与抽象工厂的区别
建造者模式着重与分步骤构造一个复杂对象,而抽象工厂则着重于多个系列的产品对象即对象族的构造。建造者实在最后一步返回具体产品,抽象工厂立即返回具体产品
5.jdk中的使用
java.lang.StringBuffer
java.lang.StringBuilder
client客户端充当了指导者角色,StringBuilder同时充当了接口和具体建造者的角色
四.原型模式
1.使用克隆的方法克隆对象,实现java的cloneable接口
2.设计原则
(1)考虑产生对象的复杂度和类复用
(2)结合系统结构考虑使用浅复制还是深复制
3.使用场合
(1)产生对象过程比较复杂,初始化需要许多资源时
(2)希望框架原型和产生对象分开时
(3)同一个对象会供其他调用者同时调用访问时
4.jdk中的使用
所有类可以重载Object类的clone方法克隆对象
5.注意事项
(1)克隆对象时,原始对象的构造方法不被执行
(2)浅复制:浅复制只是复制本对象的原始数据类型,入int,float,String等,对于数组,列表和对象引用不会复制
(3)深复制:不但对原始数据类型做复制,其他也做,当然需要手动的对不是原始对象的做克隆
五.单例模式
1.类的属性域和方法可见方式有4种:public,protected,private,默认。单例采用private构造方法,这样外部就不能使用new操作符创建对象了
2.设计原则
(1)某个类只能有一个实例
(2)该类必须自行创建这个实例
(3)该类必须自行向整个系统提供这个实例
3.使用场合
该类只需要有一个的时候,可以使用单例设计模式。
4.jdk中的使用
(1)数据库链接或Socket链接收到一定的限制,保持只能有一个链接的时候。
(2)集合中的set
(3)java.lang.Runtime
提高:多例模式实现
多例模式就是存在多个对象实例,供外部应用调用,比如数据库连接池等。