简单工厂模式(静态工厂模式)
简单工厂模式把对象的创建和使用分离,不过它并不属于 GoF 23 种设计模式之一。它适用于以下场景:
- 创建对象逻辑简单:当创建对象的逻辑较为简单,不需要复杂的初始化过程时,使用简单工厂模式可以让代码更加简洁。例如,根据不同的形状类型创建相应的形状对象:
// 抽象形状类
interface Shape {
void draw();
}
// 具体圆形类
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
// 具体矩形类
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
// 简单工厂类
class ShapeFactory {
public static Shape createShape(String type) {
if ("circle".equals(type)) {
return new Circle();
} else if ("rectangle".equals(type)) {
return new Rectangle();
}
return null;
}
}
- 产品种类较少且稳定:如果产品的种类相对较少,并且不会频繁地添加新的产品,那么简单工厂模式是一个不错的选择。因为它的实现简单,易于维护。比如一个小型的图形绘制系统,只需要处理圆形、矩形和三角形这几种基本图形。
工厂方法模式
工厂方法模式定义了创建对象的接口,将对象的实例化延迟到子类。它适用于以下场景:
- 需要灵活扩展产品:当系统需要不断添加新的产品,并且希望能够在不修改现有代码的情况下进行扩展时,工厂方法模式非常合适。例如,一个游戏开发中,不同类型的武器(如剑、弓、法杖)可以通过不同的具体工厂来创建,当需要添加新的武器类型时,只需要创建对应的具体工厂类即可。
// 抽象武器类
interface Weapon {
void attack();
}
// 具体剑类
class Sword implements Weapon {
@Override
public void attack() {
System.out.println("用剑攻击");
}
}
// 具体弓类
class Bow implements Weapon {
@Override
public void attack() {
System.out.println("用弓射击");
}
}
// 抽象工厂类
abstract class WeaponFactory {
public abstract Weapon createWeapon();
}
// 剑工厂类
class SwordFactory extends WeaponFactory {
@Override
public Weapon createWeapon() {
return new Sword();
}
}
// 弓工厂类
class BowFactory extends WeaponFactory {
@Override
public Weapon createWeapon() {
return new Bow();
}
}
- 根据不同条件创建不同对象:当需要根据不同的条件来创建不同的对象时,工厂方法模式可以将这些创建逻辑封装在具体的工厂子类中。例如,根据用户的不同权限创建不同的用户对象。
抽象工厂模式
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它适用于以下场景:
- 创建一系列相关产品:当需要创建一组相互关联的产品,这些产品通常需要一起使用,并且有不同的产品族时,抽象工厂模式是首选。例如,一个操作系统的界面元素(如按钮、文本框、滚动条),不同的操作系统(Windows、Mac OS、Linux)有不同风格的界面元素,每个操作系统可以看作一个产品族,通过抽象工厂模式可以方便地创建出同一产品族的界面元素。
// 抽象按钮类
interface Button {
void click();
}
// Windows 按钮类
class WindowsButton implements Button {
@Override
public void click() {
System.out.println("点击 Windows 按钮");
}
}
// Mac OS 按钮类
class MacOSButton implements Button {
@Override
public void click() {
System.out.println("点击 Mac OS 按钮");
}
}
// 抽象文本框类
interface TextBox {
void input();
}
// Windows 文本框类
class WindowsTextBox implements TextBox {
@Override
public void input() {
System.out.println("在 Windows 文本框输入");
}
}
// Mac OS 文本框类
class MacOSTextBox implements TextBox {
@Override
public void input() {
System.out.println("在 Mac OS 文本框输入");
}
}
// 抽象工厂类
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// Windows 工厂类
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
// Mac OS 工厂类
class MacOSFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacOSButton();
}
@Override
public TextBox createTextBox() {
return new MacOSTextBox();
}
}
- 确保产品的兼容性:使用抽象工厂模式可以保证创建出来的一系列产品是相互兼容的,因为它们都来自同一个具体工厂。例如,在一个汽车生产系统中,发动机、轮胎、车身等部件需要相互匹配,通过抽象工厂模式可以确保生产出来的这些部件是兼容的。