个人学习笔记平台,欢迎大家交流

红叶~

Be humble, communicate clearly, and respect others.

工厂模式和抽象工厂模式

工厂模式

​场景​:需要创建单一类型对象,且支持灵活扩展不同子类产品。
代码

// 抽象产品接口(定义产品规范)[1,3](@ref)
interface Animal {
    void speak();
}

// 具体产品实现类
class Dog implements Animal {
    @Override
    public void speak() {
        System.out.println("Dog: Woof!");
    }
}

class Cat implements Animal {
    @Override
    public void speak() {
        System.out.println("Cat: Meow!");
    }
}

// 抽象工厂接口(定义创建方法)[2,7](@ref)
interface AnimalFactory {
    Animal createAnimal();
}

// 具体工厂类(每个工厂对应一个产品)
class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog(); // 创建Dog对象
    }
}

class CatFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat(); // 创建Cat对象
    }
}

// 客户端调用示例
public class Client {
    public static void main(String[] args) {
        AnimalFactory dogFactory = new DogFactory();
        Animal dog = dogFactory.createAnimal(); // 获取Dog实例
        dog.speak(); // 输出:Dog: Woof!

        AnimalFactory catFactory = new CatFactory();
        Animal cat = catFactory.createAnimal(); // 获取Cat实例
        cat.speak(); // 输出:Cat: Meow!
    }
} 

理解:

  • 抽象产品接口用来定义产品规范,比如定义一些默认方法,然后有多个具体的产品实现类。创建抽象工厂接口,其中定义了创建方法,每个产品定义一个工厂类(实现工厂接口),扩展新接口时只需要新增工厂。
  • 客户端与具体产品解耦,仅依赖抽象接口。

抽象工厂模式

​场景​:需要创建一组相关或依赖的对象(如跨平台UI组件、数据库连接+命令组合)
代码

// 抽象产品族接口(定义多个关联产品)[5,10](@ref)
interface Button {
    void render();
}

interface TextBox {
    void input();
}

// 具体产品实现(Windows风格)
class WinButton implements Button {
    @Override
    public void render() {
        System.out.println("Windows风格按钮");
    }
}

class WinTextBox implements TextBox {
    @Override
    public void input() {
        System.out.println("Windows风格文本框输入");
    }
}

// 具体产品实现(Mac风格)
class MacButton implements Button {
    @Override
    public void render() {
        System.out.println("Mac风格按钮");
    }
}

class MacTextBox implements TextBox {
    @Override
    public void input() {
        System.out.println("Mac风格文本框输入");
    }
}

// 抽象工厂接口(定义创建多个产品的方法)[5,9](@ref)
// 多个组件或方法依赖的情况
interface GUIFactory {
    Button createButton();
    TextBox createTextBox();
}

// 具体工厂类(每个工厂对应一个产品族)
class WinFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WinButton(); // 创建Windows按钮
    }

    @Override
    public TextBox createTextBox() {
        return new WinTextBox(); // 创建Windows文本框
    }
}

class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton(); // 创建Mac按钮
    }

    @Override
    public TextBox createTextBox() {
        return new MacTextBox(); // 创建Mac文本框
    }
}

// 客户端调用示例
public class Client {
    public static void main(String[] args) {
        // 切换工厂即可切换整套UI风格
        GUIFactory factory = new MacFactory(); // 或 new WinFactory()

        Button button = factory.createButton();
        button.render(); // 输出风格对应的按钮

        TextBox textBox = factory.createTextBox();
        textBox.input(); // 输出风格对应的文本框
    }
}

理解:

  • 一个工厂类创建一组关联、依赖对象,包含多个抽象产品接口和具体工厂,每个工厂负责多个产品的组合,适合多产品协同合作
posted @ 2025-05-27 23:57  红叶~  阅读(10)  评论(0)    收藏  举报