目录
在学习之初,可以先了解一下三个问题。
设计模式从何而来?设计模式是什么?设计模式分别解决的是什么问题?
学习路径可参考:史上最全设计模式导学目录(完整版)_LoveLion的博客-CSDN博客_设计模式目录
一种简单工厂以及二十三种设计模式概要
类型 | 模式 | 总数 | 备注 |
---|---|---|---|
简单工厂模式 | 简单工厂模式 | 1 | |
创建型模式 | 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 | 5 | 23种设计模式 |
结构型模式 | 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式 | 7 | |
行为型模式 | 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 | 11 |
简单工厂模式
定义
所有创建对象的功能都在简单工厂这个类里完成,它包含大量的条件语句去构建实例对象。
简单工厂的要素
- 抽象产品(Coffee):描述产品的主要特性和功能,抽象的表达表达产品。代码:定义一个接口,接口里的方法代表的是这个产品的主要特性和功能。备注:也可以是抽象类。
- 具体产品(Americano ,Latte):真正的产品,美式或者拿铁才是一个真正的具体的产品,而不是抽象的”咖啡“。代码:抽象产品是接口,具体产品就对应实现类。备注:抽象产品是抽象类,具体产品就对应其子类。
- 简单工厂类(SimpleFactory):提供了真正创建产品的方法。代码:根据方法输入的类型判断需要创建的具体对象是美式还是拿铁。
抽象产品(Coffee)
public interface Coffee {
/**
* 制作咖啡
*/
void make();
}
具体产品(Americano)
public class Americano implements Coffee {
public Americano() {
}
@Override
public void make() {
System.out.println("制作一杯美式咖啡");
}
}
具体产品(Latte)
public class Latte implements Coffee {
public Latte() {
}
@Override
public void make() {
System.out.println("制作一杯拿铁咖啡");
}
}
简单工厂
public class SimpleFactory {
public static final String LATTE = "latte";
public static final String AMERICANO = "americano";
public Coffee createCoffee(String type) throws Exception {
if (Objects.equals(type, LATTE)) {
// 当type等于拿铁的时候,创建拿铁咖啡对象
return new Latte();
} else if (Objects.equals(type, AMERICANO)) {
// 当type等于美式的时候,创建美式咖啡对象
return new Americano();
} else {
throw new Exception();
}
}
}
客户
public class Client {
public static void main(String[] args) throws Exception {
// 创建拿铁对象
Coffee latte = new SimpleFactory().createCoffee("latte");
// 调用拿铁对象的制作方法
latte.make();
// 创建美式对象
Coffee americano = new SimpleFactory().createCoffee("americano");
// 调用美式对象的制作方法
americano.make();
}
}
命令行输出
"C:\Program Files\Java\jdk1.8.0_341\bin\java.exe" ...
制作拿铁咖啡
制作美式咖啡
优点:用户可以从简单工厂里统一的方式获取自己想要的产品。
缺点:来一个新的类型咖啡品种比如FlatWhite,就需要在简单工厂的代码里加上多余的代码。
else if (Objects.equals(type, FLAT_WHITE)) {
// 当type等于馥芮白的时候,创建馥芮白咖啡对象
return new FlatWhite();
}
违反了开闭原则。那么有没有可扩展性更好的呢,在新加一种咖啡品种的基础上,不需要影响到原来的代码?升级请见下一章节。
创建型模式
工厂方法
定义
使用抽象类里的抽象方法来创建对象,由继承的子类来实例化具体的类。工厂方法将对象的实例化从简单工厂类推迟到了继承抽象类的子类。
工厂方法的要素
- 抽象产品(Coffee):描述产品的主要特性和功能,抽象的表达表达产品。代码对应一个接口,接口里的方法代表的是这个产品的主要特性和功能。备注:也可以对应抽象类。
- 具体产品(Americano ,Latte):真正