总结了一部分模式定义,以后会将剩下的一部分模式定义发出来。不过学习模式的话还是要靠例子和用例图来解决。
工厂模式定义:
实例化对象,用工厂方法代替new操作
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
1、工厂类角色:这是该模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
工厂>具体产品 >抽象产品
4、简单工厂模式具有多层次的产品结构,采取的是以不变应万变的策略。
5、使用java接口或者java抽象类 (每个工工厂类可以有多个工厂方法。分别负责创建不同的产品对象)
可以省略抽象产品角色
简单工厂模式的优缺点:
1、 简单工厂模式具有可分割性,可以自行决定什么时候创建什么产品类
缺点:
1、 由于简单工厂模式使用的静态方法作为工厂方法,而静态方法不能由子类继承,因此工厂角色无法形成基于继承的等级结构。
工厂方法模式:别名:多态性工厂模式
工厂方法模式是类的创建模式,又叫做虚拟构造子模式
该模式具有平行等级结构
1、 抽象工厂角色:为工厂方法模式的核心,与程序无关,。
2、 具体工厂角色。实现了抽象才解开的具体类,与应用密切相关的逻辑。
3、 抽象产品角色:工厂方法模式所创建的对象的超类型,就是相当于产品的父类或者共同拥有的接口
抽象工厂模式:
抽象工厂模式是所以形态的工厂模式中最为抽象和最具一般性的一种形态,
主要是向客户端提供一个接口,是的客户端在不必指定产品的具体类型的情况下创建多个产品对象。
该模式具有多产品等级结构
1、 抽象工厂角色:
2、 具体工厂类角色
3、 抽象产品角色
4、 具体产品角色
什么时候考虑使用该模式
1、 一个系统不应当依赖于产品类实力如何别创建,组合,表达的细节,这对于所形态的工厂模式都很重要
2、 该系统的产品有多余一个产品族,而系统只消费其中一个产品
3、 同属于同一个产品族的产品在一起使用,
4、 系统提供一个产品类库,所以的产品已同样的接口出现,从而使客户端不依赖于实现
单例模式:
要点:1、某一个类只能有一个实例
2、 必须自行创建这个实例
3、 必须自行向整个系统提供这个实例
单例模式最重要的特点是类的构造子是私有的,避免外界利用构造子创建出多个实例
饿汉式单例类:饿汉式单例类在自己被加载时就将自己实例化
懒汉式单例模式:懒汉模式第一次被引用时就将自己实例化。
登记式单例模式:为了克服上面两种单例模式不能继承的缺点而设计的。
单例类的状态
一个类可以是有状态的一个有状态的单例对象一般也是可变的单例对象
有状态的可变的单例对象常常当做状态库使用。
没有状态的单例类
没有状态的单例类仅作为提供工具性函数的对象。
多例模式:
作为对象的创建模式,多例模式中的多例类多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例
有上限多例类:
1、 一个实例数目有上限的多例类建造到了多例类的内部。
2、 一个有上限的多例类可以使用静态变量存储所有的实例,特别是在实例数目不多的时候。
无上限多例模式
没有实例数目的限制。作为单例模式的推广
原始模型模式:
原始模型模式简称原型模式(Prototype)
克隆:
1、 对任何对象都有 克隆对象与原对象不是同一个对象
2、 对任何对象克隆对象与原对象的类型一样
3、 如果对象方法定义恰当,那么使用equqls成立
原始模型模式结构有两种:简单形式和登记形式
简单形式:
1、 客户角色:客户类提出创建对象的请求
2、 抽象原型角色:这是一个抽象角色,通常由一个java接口或者java抽象类实现,此角色给出所以具体原型类所需的接口
3、 具体原型角色:被复制的对象,此角色需要实现抽象的原型角色所要求的接口
登记形式的原始模型模式
1、 客户端角色:客户端类向管理员提出创建对象的请求
2、 抽象原型角色:这是一个抽象角色由接口或者抽象类实现,
3、 具体原型角色:被复制的对象,需要实现抽象的原型角色所要求的接口
4、 原型管理器角色:创建具体原型类的对象,并记录没一个被创建的对象
模式的实现:深复制和浅复制
浅复制(浅克隆)
被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象,换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象
深复制
被复制对象的所有的变量都含有与原来的对象相同的值,出去那些引用其他对象的变量,那些引用其他对象的变量将指向被变量复制过的信对象,而不再是原有的那些被引用的对象。
利用串行化来做深复制
场场可以先使对象实现Serializable接口,然后把对象写到一个流里面,在从流里面读回来
在什么情况下使用原始模型模式
假设一个系统的产品类是动态加载的,而且产品类具有一定的等级结构,这个时候如果使用工厂模式的话,工厂类不得不具有一个相应的等级结构,而产品类的等级结构一旦变化,等级结构就应有一个相应的变化。
这时采取原始模型模式,给没一个产品类配备一个克隆方法,便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。
原始模型模式的优缺点:
1、 该模式允许动态的增加和减少产品类,
2、 提供简化的创建结构
3、 具有给一个应用动态加载新功能的能力,
4、 产品类不需要任何事先确定等级结构
缺点:没一个类都必须配备一个克隆方法,配备克隆方法需要对类的功能进行通盘考虑,这对于一个全新的类来说不是很难,但是对已一个已经有的类就不容易。
策略模式:
策略模式属于对象的行为模式,用意针对一组算法,将每一个算法封装到具有共同接口的独立的类中。从而使得他们可以相互替换,策略模式使得算法可以在不影响到客户端的情况下发生变化。
提供三种方案:
1、 所有的业务逻辑都放在客户端里面,客户端利用条件选择语句决定使用哪一个算法,这样,客户端代码会变得复杂和难以维护
2、 客户端可以利用继承的方法在子类里卖弄事项不同的行为,单这样会使得环境和行为紧密耦合在一起,
3、 使用策略模式把行为和环境分割开。环境类负责位置和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减修改都不h会影响环境和客户端
策略模式就是对算法的包装
策略模式的结构
策略又称为政策模式。
1、 环境角色:持有一个Strategy类的引用
2、 抽象策略角色:是一个抽象角色,通常由一个接口或者抽象类实现
3、 具体策略角色:包装相关的算法或者行为
模式的实现:
1、把共有的行为放到共同的抽象策略角色类里面。
这个时候抽象策略角色必须要使用抽象类实现而不能使用java接口
3、 策略模式在每个时刻都只能使用一个策略对象,但有的时候一个应用程序同时与几个策略对象想联系。
设计一个排序的策略系统
排序:二元排序,泡沫排序,堆栈排序,快速排序,基数排序
在什么情况下使用策略模式
1、 如果一个系统里面有多一个类,他们之间的区别仅在于他们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为
2、 一个熊需要动态的在几种算法中选择一种,那么这些算法可以包装到一个具体算法类里面
3、 一个系统的算法使用的数据不可以让客户端知道,策略模式可以避免让客户端涉及到不必要接触到的复杂的只与算法相关的数据
4、 如果一个对象有很多行为。
策略模式优缺点
1、 提供了管理相关算法族的方法
2、 提供了可以替换继承关系的方法
3、 避免使用多重条件转换语句
缺点
1、 客户端必须知道策略类并且自行决定使用哪一种
2、 造成很多的策略类