工厂模式及抽象工厂模式

工厂模式和抽象工厂模式都是创建型设计模式,用于对象的创建,但它们在抽象层次和应用场景上有所不同。

工厂模式 (Factory Pattern)

概念

工厂模式定义了一个创建对象的接口,但让子类决定实例化哪个类。工厂方法让类的实例化推迟到子类。

特点

  • 通过工厂方法创建对象,而不是直接使用new操作符

  • 客户端代码只需知道抽象接口,无需关心具体实现

  • 便于扩展新的产品类型

实现方式

// 产品接口
interface Product {
    void use();
}

// 具体产品A
class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using Product A");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using Product B");
    }
}

// 工厂接口
interface Factory {
    Product createProduct();
}

// 具体工厂A
class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactoryA();
        Product product = factory.createProduct();
        product.use(); // 输出: Using Product A
    }
}

抽象工厂模式 (Abstract Factory Pattern)

概念

抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

特点

  • 创建的是产品族(多个相关产品)

  • 比工厂模式更高层次的抽象

  • 易于交换产品系列

  • 难以支持新增产品种类

实现方式

// 抽象产品A
interface AbstractProductA {
    void useA();
}

// 抽象产品B
interface AbstractProductB {
    void useB();
}

// 具体产品A1
class ProductA1 implements AbstractProductA {
    @Override
    public void useA() {
        System.out.println("Using Product A1");
    }
}

// 具体产品A2
class ProductA2 implements AbstractProductA {
    @Override
    public void useA() {
        System.out.println("Using Product A2");
    }
}

// 具体产品B1
class ProductB1 implements AbstractProductB {
    @Override
    public void useB() {
        System.out.println("Using Product B1");
    }
}

// 具体产品B2
class ProductB2 implements AbstractProductB {
    @Override
    public void useB() {
        System.out.println("Using Product B2");
    }
}

// 抽象工厂
interface AbstractFactory {
    AbstractProductA createProductA();
    AbstractProductB createProductB();
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}

// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        AbstractFactory factory = new ConcreteFactory1();
        AbstractProductA productA = factory.createProductA();
        AbstractProductB productB = factory.createProductB();
        
        productA.useA(); // 输出: Using Product A1
        productB.useB(); // 输出: Using Product B1
    }
}

两种模式的主要区别

  1. 抽象层次

    • 工厂模式:针对单个产品

    • 抽象工厂模式:针对产品族

  2. 扩展性

    • 工厂模式:易于新增产品类型

    • 抽象工厂模式:难以新增产品种类(需要修改所有工厂类),但易于新增产品系列

  3. 复杂度

    • 工厂模式相对简单

    • 抽象工厂模式更复杂

应用场景选择

  • 当系统只需要创建一种产品时,使用工厂模式

  • 当系统需要创建一组相关或依赖的产品时,使用抽象工厂模式

  • 当系统需要易于扩展新的产品类型时,使用工厂模式

  • 当系统需要保证产品之间的兼容性时,使用抽象工厂模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大樊子

有钱捧个人场,没钱捧个钱场😜

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

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

打赏作者

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

抵扣说明:

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

余额充值