23种设计模式 -- 工厂模式

Java 工厂模式示例代码

下面我将展示三种常见的工厂模式实现:简单工厂模式、工厂方法模式和抽象工厂模式。

1. 简单工厂模式

java

复制代码
// 产品接口
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 Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个正方形");
    }
}

// 简单工厂类
class ShapeFactory {
    // 使用getShape方法获取形状类型的对象
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

// 测试类
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        
        // 获取Circle对象并调用它的draw方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();
        
        // 获取Rectangle对象并调用它的draw方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();
        
        // 获取Square对象并调用它的draw方法
        Shape shape3 = shapeFactory.getShape("SQUARE");
        shape3.draw();
    }
}

2. 工厂方法模式

java

复制代码
// 产品接口
interface Button {
    void render();
    void onClick();
}

// 具体产品类
class HtmlButton implements Button {
    @Override
    public void render() {
        System.out.println("<button>HTML按钮</button>");
        onClick();
    }

    @Override
    public void onClick() {
        System.out.println("点击HTML按钮! 浏览器跳转");
    }
}

class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("绘制Windows风格按钮");
        onClick();
    }

    @Override
    public void onClick() {
        System.out.println("点击Windows按钮! 执行命令");
    }
}

// 创建者抽象类
abstract class Dialog {
    public void renderWindow() {
        Button okButton = createButton();
        okButton.render();
    }
    
    // 工厂方法
    public abstract Button createButton();
}

// 具体创建者类
class HtmlDialog extends Dialog {
    @Override
    public Button createButton() {
        return new HtmlButton();
    }
}

class WindowsDialog extends Dialog {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
}

// 测试类
public class FactoryMethodDemo {
    private static Dialog dialog;

    public static void main(String[] args) {
        configure();
        runBusinessLogic();
    }

    static void configure() {
        if (System.getProperty("os.name").equals("Windows 10")) {
            dialog = new WindowsDialog();
        } else {
            dialog = new HtmlDialog();
        }
    }

    static void runBusinessLogic() {
        dialog.renderWindow();
    }
}

3. 抽象工厂模式

java

复制代码
// 抽象产品接口
interface Checkbox {
    void paint();
}

interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// 具体产品类
class MacOSButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染MacOS风格按钮");
    }

    @Override
    public void onClick() {
        System.out.println("MacOS按钮点击事件");
    }
}

class MacOSCheckbox implements Checkbox {
    @Override
    public void paint() {
        System.out.println("渲染MacOS风格复选框");
    }
}

class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染Windows风格按钮");
    }

    @Override
    public void onClick() {
        System.out.println("Windows按钮点击事件");
    }
}

class WindowsCheckbox implements Checkbox {
    @Override
    public void paint() {
        System.out.println("渲染Windows风格复选框");
    }
}

// 具体工厂类
class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new MacOSCheckbox();
    }
}

class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

// 客户端代码
class Application {
    private Button button;
    private Checkbox checkbox;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    public void paint() {
        button.render();
        checkbox.paint();
    }
}

// 测试类
public class AbstractFactoryDemo {
    private static Application configureApplication() {
        Application app;
        GUIFactory factory;
        
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("mac")) {
            factory = new MacOSFactory();
        } else {
            factory = new WindowsFactory();
        }
        
        app = new Application(factory);
        return app;
    }

    public static void main(String[] args) {
        Application app = configureApplication();
        app.paint();
    }
}

总结

  1. 简单工厂模式

    • 一个工厂类根据传入的参数决定创建哪种产品

    • 适用于产品较少且不经常变化的情况

  2. 工厂方法模式

    • 定义一个创建对象的接口,但让子类决定实例化哪个类

    • 适用于需要扩展性强、产品种类可能增加的情况

  3. 抽象工厂模式

    • 提供一个创建一系列相关或相互依赖对象的接口

    • 适用于产品族的情况,需要创建多个相关产品对象

每种模式都有其适用场景,选择哪种模式取决于具体的需求和设计目标。

相关推荐
geovindu5 小时前
go: Mediator Pattern
设计模式·golang·中介者模式
kyriewen11 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
Pkmer20 小时前
古法编程: 适配器模式
java·设计模式
灰子学技术1 天前
Envoy 使用的设计模式技术文档
设计模式
Carl_奕然2 天前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手2 天前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子2 天前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu3 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force3 天前
02_state
设计模式·蓝牙
qcx233 天前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap