需要UML图
设计模式分三类,分别是 创建型、结构型和行为型。
(一)设计原则
记忆方法solid
1. 单一职责原则
一个类只有一个职责。
2. 开闭原则
一个软件对扩展开放,对修改关闭。
3. 里氏替换原则
子类能完全替换父类【凡是能用父类的地方,都可以使用子类--要求父类方法的简洁,不能为了某一个子类的实现而强行扩展父类】
4. 接口隔离原则
一个类对另外一个类的依赖,建立在最小的接口之上。
5. 依赖倒置原则DIP
高层模块不依赖底层模块,两者都依赖其抽象【依赖抽象而非依赖具体,依赖接口而非依赖实现】
6. 迪米特法则
一个软件,尽可能少的和其它实体发生相互作用。
(二)创建型
创建型模式 是创建对象的模式,抽象了实例化的过程。
创建型模式分为5种,分别是 单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。记忆口诀:抽工单建原
1. 单例模式
定义:单例模式;一个类只有一个实例,而且自行实例化冰箱整个系统提供这个实例。
实现:单例的特征:
(1) 构造方法私有 private(确保外部不能通过沟通方法重新创新新的实例)
Private class Singleton(){}
(2) 静态的类对象私有private static Singleton = ?
?分别代表两种可能。Null和new Singleton(). 可以分为懒汉模式和饥汉模式
懒汉模式:private static Singleton = null 类加载的时候,并不实例化自己。
饥汉模式:private static Singleton = new Singleton() 类加载的时候,已经实例化自己。
(3) 对外提供公用的创建接口。(保证所有实例化都调用一个方法。方法保证只被实例化一次) public static Singleton getInstance() = {}
懒汉模式:需要在第一次调用的时候初始化。线程不安全,需要添加方法同步。
Synchronized Public static Singleton getInstance () = {
If(instance == null){
Instance = new Singleton();
}
Return instance;
}
饥汉模式:线程安全。类加载的时候,已经进行了初始化。所以可以直接返回。
Public static Singleton getInstance () = {
Return instance;
}
2. 工厂方法模式
定义:一个创建产品的工厂结构。将实际创建工作推迟到子类中实现。
优点:将产品的生产聚集到一个特定的地方,方便代码的维护。具体业务中只依赖抽象产品。真是执行流程中加载的是那个产品对象是有运行时参数决定。实现可插拔。本质是依赖抽象而为具体实现。
工厂方法模式涉及4个角色。分别是 抽象工厂、具体工厂、抽象产品和具体产品。
(1) 抽象产品:定义我们需要的产品的共性,实现对产品的抽象定义。
一般是接口。
Public interface Product(){
// 接口的公用方法
Public void method1();
Public void method2();
}
(2) 具体产品:实现抽线接口,我们需要的具体产品。
Public class Concrete_Product() implements Product(){
Public void method1(){
// 具体实现
}
Public void method2(){
// 具体实现
}
}
(3) 抽象工厂:定义生产产品的抽象。返回的结果必须是 抽象产品。在具体工厂中 生产出的是具体的产品(抽象产品的实现Impl)。
核心是 定义参数,返回值必须是抽象产品。其中参数有多种,可以是枚举类型(或者字符串)匹配转发 或者是 类通过反射生成。
(4) 具体工厂:实现抽象工厂。核心是:根据参数,确定工厂返回(不同的)具体产品。
根据抽象工厂的定义,实现具体的逻辑代码。
3. 抽象工厂模式
抽象工厂模式和工厂方法模式很类似。组成角色也都一样。需要了解清楚两者之间的区别和使用场景即可。
定义:为创建一组相互依赖的对象 提供的接口。
在工厂方法模式中,我们假设需要一种产品。而如果需要多种产品时,且产品之间是相互依赖的。这个时候如果使用工厂方法模式。需要创建多个产品工厂,且没法表达之间的依赖。这种场景下,适合使用抽象工厂。
(1) 抽象产品
Public interface Product_A(){
// 具体方法定义
Public void method1()
// 具体方法定义
Public void method2()
}
Public interface Product_B(){
// 具体方法定义
Public void method1()
// 具体方法定义
Public void method2()
}
(2) 具体产品
省略
(3) 抽象工厂
// 产品A和B有依赖关系,是一族产品
Public class concrete_Factory(){
// 生产A产品
Public Product_A factory_A()
// 生产B产品
Public Product_A factory_B()
}
(4) 具体工厂
省略
应用:调用的时候,先创建具体的工厂。然后使用具体的工厂调用里面创建product_A 和Product_B
4. 建造者模式
定义:将 部件的生产 和 产品对象的组装 分离出来。生产产品的时候,包含两部分,一部分是部件的生产,一部分是对象的组装。也是 对象的构建和表示分离。
优点:客户端在不知道具体创建细节的情况下,可以创建产品。(用户只需要知道产品需要哪些部件和顺序,可以在导演角色中创建产品,而不需要知道各个部件的生产细节)
建造者分为三个角色。产品角色、抽象建造者、具体建造者和导演者角色。
(1) 产品角色
// Product 忽略
(2) 抽象建造者
Public abstract class Builder {
// 部件定义
Private part1 ...
Private part2 ...
Private part3 ...
// 部件生产方法
Public void setPart1();
Public void setPart2();
Public void setPart3();
// 部件组装方法(创建产品)
Public abstract Product builder_Product();
// 在具体建造者中 对产品部件的组装。
Part1+part2+part3 返回 product
}
(3) 具体建造者
(4) 导演者
安排已有部件的顺序。然后让具体建造者建造产品。一般而言,导演角色中有多个产品的具体构造者。
5. 原型模式
定义:原型模式的核心是通过clone的方式实例化产品。
原型模式分为3个角色。抽象原型、具体原型和客户。比较简单。用一句话描述:在抽象原型继承cloneable 接口,具体原型中实现clone方法。最后在客户角色中通过 .clone 方法创建新的对象。
(1) 抽象原型
定义原型类的接口,继承cloneAble接口
Public interface protoType extends CloneAble{
// 克隆方法
ProroType clone ();
}
(2) 具体原型
具体功能外,实现接口中定义的克隆方法clone。调用super.clone() ,实现原型的克隆。
(3) 客户
通过protoType对象。调用clone方法产生新的对象。