设计模式(一)

需要UML

设计模式分三类,分别是 创建型结构型行为型

(一)设计原则

记忆方法solid

1. 单一职责原则

一个类只有一个职责。

2. 开闭原则

一个软件对扩展开放,对修改关闭。

3. 里氏替换原则

子类能完全替换父类【凡是能用父类的地方,都可以使用子类--要求父类方法的简洁,不能为了某一个子类的实现而强行扩展父类】

4. 接口隔离原则

一个类对另外一个类的依赖,建立在最小的接口之上。

5. 依赖倒置原则DIP

高层模块不依赖底层模块,两者都依赖其抽象【依赖抽象而非依赖具体,依赖接口而非依赖实现】

6. 迪米特法则

一个软件,尽可能少的和其它实体发生相互作用。

(二)创建型

创建型模式 是创建对象的模式,抽象了实例化的过程。

创建型模式分为5种,分别是 单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。记忆口诀:抽工单建原

1. 单例模式

定义:单例模式;一个类只有一个实例,而且自行实例化冰箱整个系统提供这个实例。

实现:单例的特征:

(1) 构造方法私有 private(确保外部不能通过沟通方法重新创新新的实例)

     Private class Singleton(){}

(2) 静态的类对象私有private static Singleton =

?分别代表两种可能。Nullnew 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) 抽象工厂

 

// 产品AB有依赖关系,是一族产品

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方法产生新的对象。

posted @ 2020-10-23 15:53  IT迷途小书童  阅读(135)  评论(0编辑  收藏  举报