工厂模式的使用准则

简单工厂模式(静态工厂模式)

简单工厂模式把对象的创建和使用分离,不过它并不属于 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();
    }
}
  • 确保产品的兼容性:使用抽象工厂模式可以保证创建出来的一系列产品是相互兼容的,因为它们都来自同一个具体工厂。例如,在一个汽车生产系统中,发动机、轮胎、车身等部件需要相互匹配,通过抽象工厂模式可以确保生产出来的这些部件是兼容的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qzer_407

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值