各模式的重要等级(最高五颗星):
简单工厂模式:※※※※
工厂方法模式:※※※※※
抽象工厂模式:※※※※※
建造者模式:※※
原型模式:※※※
单例模式:※※※※
适配器模式:※※※※
桥接模式:※※※
组合模式:※※※※
装饰模式:※※※
外观模式:※※※※※
享元模式:※
代理模式:※※※※
职责链模式:※※
命令模式:※※※※
解释器模式:※
迭代器模式:※※※※※
中介者模式:※※
备忘录模式:※※
观察者模式:※※※※※
状态模式:※※※
策略模式:※※※※
模板方法模式:※※※
访问者模式:※
一、类图简述
类之间的关系
1.关联关系
描述的是:一个对象请求另一个对象的服务
体现:在一个类中声明另一个类的对象,然后使用另一个类的服务
关联关系如下类型
(1)双向关联及对应的java代码
默认情况下关联是双向的,用一条实线连接两个类,这条线叫关联路径。
(2)单向关联及对应的java代码
用带箭头的实线表示
(3)自关联及对应的java代码
在类中嵌套自身类型的对象
(4)多重性关联及对应的java代码
放在关联端,表示源端的一个对象可以与另一端的多少个对象相关联
(5)聚合关系及代码体现
描述整体和部分的关系,部分可以脱离整体独立存在;说明整体和部分的请求服务关系
实现:因为部分可以脱离整体而存在,所以先在整体类中中声明部分类的对象,然后再通过构造注入或设置注入的方式将部分类的实例传入进来
(6)组合关系及代码体现
描述整体和部分的关系,整体对象不存在,部分对象也跟着不存在;说明整体和部分的请求服务关系
实现:①先在整体类中声明部分类的对象,②然后在整体类的构造方法中实例化部分类的对象。这样做可以在创建整体类对象时同时创建部分类对象,销毁整体类对象时同时销毁部分类对象
2.依赖关系
依赖关系是一种使用关系,一个事物变化会影响另一个事物
体现:在某个类的方法中使用另一个类的对象作为参数
3.泛化关系
泛化关系其实就是继承,用于描述父类与子类之间的关系
4.实现关系
二、面向对象设计原则
1.单一职责原则:一个类应该只包含单一的职责(单一的职责:一个逻辑的方法)
2.开闭原则:软件实体对扩展开放,对修改关闭(软件实体:类、方法、模块)
开闭原则分析:抽象是开闭原则的关键,在java、C#等面向对象编程语言中,应该为系统定义一个相对稳定的抽象层,将不同的功能在具体的实现层中完成
3.里氏代换原则:在所有使用基类对象的地方都可以使用其子类对象来代替(用基类声明对象,而用子类来实例化)
4.依赖倒置原则:要针对接口或抽象类编程,而不是针对具体类编程(父类型的引用指向子类型的对象)
DIP中经常被提及的两个概念
- 类之间的耦合
- 依赖注入::将一个类的对象传入到另一个类里面,传入时要尽量注入父类对象,在程序运行时再通过子类对象覆盖父类对象
注入方式:
构造注入:通过本类的构造函数注入其他类的实例对象
设值注入:通过Setter方法注入实例对象
接口注入:通过接口方法注入实例对象
5.接口隔离原则:客户端不应该依赖那些它不需要的接口
6.合成复用原则:要尽量使用关联(组合/聚合)关系,少用继承来达到复用的目的
7.迪米特法则(最少知识原则):一个软件实体要尽可能少的与其他实体发生相互作用
三、设计模式概述
设计模式的定义:一套解决相同、相似问题的模板
基本要素:
1.模式名称
2.问题:在何时使用模式
3.解决方案:描述设计模式的组成部分,以及组成成分之间的关系
4.效果:主要包含模式的优缺点分析
设计模式的分类:
按目的可分为创建型、结构型、行为型三种:
(1)创建型模式主要用于 解决创建对象的问题
(2)结构型模式用于 把类或对象结合在一起形成更大的结构
结构型模式可以描述两种不同的东西:类和对象,根据这个,结构型模式又可以分为:
类结构型模式:类结构型模式关心类的组合,由多个类可以组成一个更大的系统;一般只存在继承关系和实现关系;
对象结构型模式:对象型模式关心类和对象的组合;通过关联关系使得在一个类中定义另一个类的实例对象,然后通过此对象调用其方法
分析:根据合成复用原则,在系统中要尽量使用关联关系来替代继承关系,所有大部分结构型模式都是对象结构型模式
(3)行为型模式主要用于 解决类或对象之间的交互问题。
简单工厂模式
模式动机
模式定义:
定义一个类来创建其他类的实例,根据参数的不同创建不同类的实例,被创建的实例通常具有共同的父类,属于类创建型模式,又叫作静态工厂方法模式。
简单工厂模式的结构图&包含的角色:
结构图:
包含的角色:
1. Product(抽象产品角色):即抽象产品类,是具体产品的父类,负责描述所有实例共有的公共接口。
解析:可以是一个接口也可以是一个抽象类,其中声明了所有产品都有的抽象业务方法。
2. ConcretePreduct(具体产品角色):是简单工厂模式的创建目标。
解析:是抽象产品类的子类,是具体的产品,每个具体产品角色都继承了抽象产品角色,需要实现抽象产品中的抽象业务方法
3. Factory(工厂类角色):即工厂类,简单工厂模式的核心,实现创建实例对象的内部逻辑。
解析:在工厂类里面定义了一个静态的工厂方法,其包含一个字符串类型的参数,在方法体中根据不同的参数实例化不同的具体产品对象,并返回。
简单工厂模式实例与解析:
使用简单工厂模式来实现这个实例
实例说明:某电视机专为各知名电视机品牌代工生产各类电视机,当需要海尔电视机时只需要在调用工厂的工厂方法时传入参入Haier,需要海信电视机时传入参数Hisense。工厂方法就可以根据传入参数的不同创建并返回不同品牌的电视机。
实例类图
实例代码
(1)抽象产品类TV(电视机类)
public interface TV{
public void play();
}
TV充当抽象产品角色,可以是接口也可以是抽象类,其中包含了所有产品都有的抽象业务方法Play()
(2)具体产品类HaierTV(海尔电视机类)
public class HaierTV implements TV{
public void play(){
System.out.println("海尔电视机播放...");
}
}
HaierTV是抽象产品TV接口的子类,是具体的产品,实现了TV接口中定义的业务方法play()
(3)具体产品类HisenseTV(海信电视机类)
public class HisenseTV implements TV{
public void play(){
System.out.println("海信电视机播放...");
}
}
HisenseTV是抽象产品TV接口的子类,另一个具体产品
(4)工厂类TVFactory(电视机工厂类)
public class TVFactory{
public static TV productTV(String brand)throws Exception{ //静态方法
if(brand.equalsIgnoreCase("Haier")){ //根据不同的参数实例化出不同的具体产品对象
System.out.println("工厂生产海尔电视机");
return new HaierTV();
}
else if(brand.equalsIgnoreCase("Hisense")){
System.out.println("工厂生产海信电视机");
return new HisenseTV();
}
else{
throw new Exception("暂不生产该brand的电视机!");
}
}
}
TVFactory作为工厂类,是简单工厂模式的核心,在里面定义了静态的工厂方法productTV(),其有一个字符串类型的参数,在方法体中根据参数的不同实例化不同的具体产品类对象,并返回
优缺点
优点:
缺点:
适用环境
1. 工厂类负责创建的对象比较少(由于创建的对象少,所以不会造成工厂方法中的业务逻辑过于复杂)
2. 客户端不需要关心对象的创建细节,只需要知道类型所对应的参数即可获得对象
工厂方法模式(一个具体工厂类对应实例化一种具体产品对象)
模式动机
模式定义:
工厂方法模式又称工厂模式,也叫虚拟构造器模式和多态工厂模式,属于类创建型模式。通过定义抽象工厂父类负责定义创建产品对象的公共接口,工厂子类则负责创建具体的产品对象。
工厂方法模式结构图&包含的角色:
结构图:
包含的角色:
1. Product(抽象产品):抽象产品角色,可以是一个抽象类也可以是一个接口,其中定义了所有产品都具有的抽象业务方法
2. ConcretePreduct(具体产品):具体产品类实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们存在一对一的关系。
解析:是抽象产品类的子类,是一种具体的产品,每个具体产品角色都继承了抽象产品角色,需要实现抽象产品中的抽象业务方法
3. Factory(抽象工厂):是工厂方法模式的核心,任何在模式中创建对象的工厂类都必须实现该接口,用于创建并返回一个产品
解析:可以是一个接口也可以是一个抽象类,在抽象工厂中定义了抽象的工厂方法,用于创建和返回抽象产品类型的对象
4. ConcreteFactory(具体工厂):抽象工厂类的子类,并可由客户调用返回一个具体产品类的实例。
解析:抽象工厂类的子类,实现了抽象工厂中的抽象工厂方法,在工厂方法中创建并返回一个具体产品类的实例
工厂模式的实例与解析
工厂模式实例之电视机工厂
实例说明:某电视机工厂专为各电视机品牌代工生产各类电视机,当需要海尔电视机时只需要在调用工厂的工厂方法时传入参入Haier,需要海信电视机时传入参数Hisense。工厂方法就可以根据传入参数的不同创建并返回不同品牌的电视机。
实例类图:
实例代码及解释:
(1)抽象产品类TV(电视机类)
public interface TV{
public void play();
}
TV是抽象产品类,可以是接口也可以是抽象类,里面定义了所有产品的抽象业务方法play()
(2)具体产品类HaierTV(海尔电视机类)
public class HaierTV implements TV{
public void play(){
System.out.println("海尔电视机播放....");
}
}
HaierTV抽象产品TV接口的子类,是一种具体的产品,实现了TV接口中的抽象业务方法
(3)具体产品类HisenseTV(海信电视机类)
public class HisenseTV implements TV{
public void play(){
System.out.println("海信电视机播放....");
}
}
(4)抽象工厂类TVFactory(抽象电视机工厂类)
public interface TVFactory{
public TV produceTV(); //定义抽象的工厂方法
}
可以是一个接口也可以是一个抽象类,它里面定义了抽象的工厂方法produceTV(),创建并返回抽象产品TV类型的对象
(5)具体工厂类HaierTVFactory(海尔电视工厂)
public class HaierTVFactory implements TVFactory{
public TV produceTV(){
System.out.println("海尔电视机工厂生产海尔电视"); //实现了抽象工厂方法produceTV(),在工厂方法中创建并返回一个具体产品对象
return new HaierTV();
}
HaierTVFactory是具体的工厂类,是抽象工厂类TVFactory的子类,实现了抽象工厂方法produceTV(),在工厂方法中创建并返回一个具体产品对象
(6)具体工厂类HisenseTVFactory(海信电视工厂类)
public class HisenseTVFactory implements TVFactory{
public TV produceTV(){
System.out.println("海信电视机工厂生产海信电视");
return new HisenseTV();
}
优缺点
优点:
缺点:
适用环境:
抽象工厂模式(抽象工厂模式与工厂方法模式最大的区别:抽象工厂中的每个工厂可以创建多种产品;而工厂方法的每个工厂只能创建一种的产品)
两个概念:
产品等级结构:多个品牌下的同种类产品(如相同类型的电器构成了一个产品等级结构)
产品族:一个品牌下的多种不同类产品(如相同品牌的电器构成一个产品族)
模式动机
模式定义:
提供一个创建一系列相关或相互依赖的对象的接口,而无须指定它们具体的类,属于对象创建型模式(用一个具体工厂实现抽象工厂就可以生产一个产品族,也就是多种产品)
抽象工厂模式结构图&角色
结构图:
包含的角色:
AbstractFactory(抽象工厂):定义创建多种产品的多个抽象方法
ConcreteFactory(具体工厂):实现抽象工厂中创建各种产品