1.设计模式的分类
- 创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
- 结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
- 行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。
目的是提供一个接口以创建一系列相关或者依赖对象,而不需要指定它们具体的类。
2.四个主要角色
-
抽象工厂(Abstract Factory):
- 定义了一个创建产品族的接口。它声明了一组方法,这些方法用于创建抽象产品。
-
具体工厂(Concrete Factory):
- 实现了抽象工厂接口,并且具体实现这些方法以创建具体产品。每个具体工厂都对应一个产品族,并且负责创建该产品族中的产品。
-
抽象产品(Abstract Product):
- 定义了产品的接口,这些接口是产品类的抽象。它为产品族中的产品提供了统一的接口。
-
具体产品(Concrete Product):
- 实现了抽象产品接口的具体类。具体产品由具体工厂创建,并且组成了一个产品族。每个具体产品都是抽象产品的一个实现。
3.类比电脑制造商
3.1故事背景:
想象你是一个电脑制造商,你的公司生产两种类型的电脑:Windows电脑和Mac电脑。每种电脑都有其独特的用户界面(GUI)和文件系统(FileSystem)。你的任务是确保用户在购买时,能够获得与他们选择的操作系统相匹配的GUI和FileSystem。
3.2讲解过程:
-
假设你是客户,走进电脑商店,告诉店员:“我想要一台Windows电脑。”
- 店员会从
WindowsFactory
工厂为你创建一套Windows电脑组件,包括:- 调用
createGUI()
方法,得到一个WindowsGUI
对象,显示Windows用户界面。 - 调用
createFileSystem()
方法,得到一个WindowsFileSystem
对象,格式化Windows文件系统。
- 调用
- 店员会从
-
如果你说:“我想要一台Mac电脑。”
- 店员会从
MacFactory
工厂为你创建一套Mac电脑组件,包括:- 调用
createGUI()
方法,得到一个MacGUI
对象,显示Mac用户界面。 - 调用
createFileSystem()
方法,得到一个MacFileSystem
对象,格式化Mac文件系统。
- 调用
- 店员会从
3.3代码示例
// 抽象产品:用户界面组件
interface GUI {
void display();
}
// 抽象产品:文件系统组件
interface FileSystem {
void format();
}
// Windows系统的用户界面组件
class WindowsGUI implements GUI {
public void display() {
System.out.println("Displaying Windows GUI.");
}
}
// Mac系统的用户界面组件
class MacGUI implements GUI {
public void display() {
System.out.println("Displaying Mac GUI.");
}
}
// Windows系统的文件系统组件
class WindowsFileSystem implements FileSystem {
public void format() {
System.out.println("Formatting Windows file system.");
}
}
// Mac系统的文件系统组件
class MacFileSystem implements FileSystem {
public void format() {
System.out.println("Formatting Mac file system.");
}
}
// 抽象工厂:操作系统工厂
interface OSFactory {
GUI createGUI();
FileSystem createFileSystem();
}
// Windows系统工厂
class WindowsFactory implements OSFactory {
public GUI createGUI() {
return new WindowsGUI();
}
public FileSystem createFileSystem() {
return new WindowsFileSystem();
}
}
// Mac系统工厂
class MacFactory implements OSFactory {
public GUI createGUI() {
return new MacGUI();
}
public FileSystem createFileSystem() {
return new MacFileSystem();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
OSFactory factory;
// 用户选择购买Windows系统
factory = new WindowsFactory();
GUI windowsGUI = factory.createGUI();
FileSystem windowsFileSystem = factory.createFileSystem();
windowsGUI.display();
windowsFileSystem.format();
// 用户选择购买Mac系统
factory = new MacFactory();
GUI macGUI = factory.createGUI();
FileSystem macFileSystem = factory.createFileSystem();
macGUI.display();
macFileSystem.format();
}
}