抽象工厂方法模式

定义

为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体类

使用场景

一个对象族有相同的约束时可以使用抽象工厂模式。例如生产一部车需要很多部件:轮胎、发动机、制动系统等,不同的型号会有不同的部件,而这些部件之间又是相互依赖的。这时候就可以考虑使用抽象工厂模式。

关键点

抽象工厂—声明一组用于创建一个产品的方法,每个方法对应生产一种产品或者称之为组件

具体工厂—抽象工厂的实现类,实现了在 抽象工厂中定义的创建产品的方法,生产一组具体产品,这些产品又可以组装成一个产品种类。

抽象产品—为每种产品声明接口

具体产品—定义具体工厂需要生产的具体产品对象

实现(以生产一辆车为例)

声明三个组件接口-即抽象产品的角色

/**
 * 抽象产品组件—制动系统
 */
public interface IBrake {

    void brake();

}

/**
 * 抽象产品组件—发动机
 */
public interface IEngine {

    void engine();

}

/**
 * 抽象产品组件—轮胎
 */
public interface ITire {

    void tire();

}

组件的具体实现类—具体产品的角色

/**
 * 具体产品组件—1号制动系统
 */
public class Brake1 implements IBrake {
    @Override
    public void brake() {

    }
}

/**
 * 具体产品组件—2号制动系统
 */
public class Brake2 implements IBrake {
    @Override
    public void brake() {

    }
}


/**
 * 具体产品角色—1号发动机
 */
public class Engine1 implements IEngine {

    @Override
    public void engine() {

    }

}

/**
 * 具体产品角色—2号发动机
 */
public class Engine2 implements IEngine {

    @Override
    public void engine() {

    }

}

/**
 * 具体的产品组件—1号轮胎
 */
public class Tire1 implements ITire {

    @Override
    public void tire() {

    }
}


/**
 * 具体的产品组件—2号轮胎
 */
public class Tire2 implements ITire {

    @Override
    public void tire() {

    }
}

抽象工厂和具体工厂

/**
 * 抽象工厂—声明一组用于创建一个产品的方法
 */
public abstract class AbstractFactory {

    /**
     * 生产轮胎
     */
    public abstract ITire createTire();

    /**
     * 生产发动机
     */
    public abstract IEngine createEngine();

    /**
     * 生产制动系统
     */
    public abstract IBrake createBrake();

}

/**
 * 具体工厂—专门生产1号车相关组件
 */
public class Car1Factory extends AbstractFactory {

    @Override
    public ITire createTire() {
        return new Tire1();
    }

    @Override
    public IEngine createEngine() {
        return new Engine1();
    }

    @Override
    public IBrake createBrake() {
        return new Brake1();
    }
}


/**
 * 具体工厂—专门生产2号车相关组件
 */
public class Car2Factory extends AbstractFactory {

    @Override
    public ITire createTire() {
        return new Tire2();
    }

    @Override
    public IEngine createEngine() {
        return new Engine2();
    }

    @Override
    public IBrake createBrake() {
        return new Brake2();
    }
}

使用

AbstractFactory factory = new Car1Factory();   
factory.createTire().tire();
factory.createEngine().engine();
factory.createBrake().brake();

小结

抽象工厂是一种用户不需要关心内部实现,只需要使用一种工厂就可以生产一组相关性很高的对象的创建型模式,类与类之间通过抽象产生依赖,每一个类又负责具体的单一角色,完全符合软件设计原则。

优点:

1.分离接口的实现,客户端使用抽象工厂来创建需要的对象,而不需要关心具体的内部实现,耦合度较低,同时基于接口的实现和隔离,使得软件设计更加灵活、容易

缺点:

1.类文件太多

2.不太容易扩展新的产品类,因为每当增加一个新的产品类时,每一个抽象产品组件都需要增加实现,同时添加新的工厂类。

抽象工厂方法模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或依赖对象的家族,而无需指定它们具体的类。 在 C++ 中,抽象工厂方法模式通常通过定义一个抽象基类来实现。这个抽象基类定义了一系列纯虚函数,用于创建不同类型的产品对象。然后,针对不同的产品族,创建具体的工厂类,这些工厂类实现了抽象基类中定义的纯虚函数,用于创建具体的产品对象。 以下是一个简单的抽象工厂方法模式的示例代码: ```c++ // 抽象产品类 A class AbstractProductA { public: virtual void operationA() = 0; }; // 抽象产品类 B class AbstractProductB { public: virtual void operationB() = 0; }; // 具体产品类 A1 class ConcreteProductA1 : public AbstractProductA { public: void operationA() { std::cout << "ConcreteProductA1::operationA()" << std::endl; } }; // 具体产品类 A2 class ConcreteProductA2 : public AbstractProductA { public: void operationA() { std::cout << "ConcreteProductA2::operationA()" << std::endl; } }; // 具体产品类 B1 class ConcreteProductB1 : public AbstractProductB { public: void operationB() { std::cout << "ConcreteProductB1::operationB()" << std::endl; } }; // 具体产品类 B2 class ConcreteProductB2 : public AbstractProductB { public: void operationB() { std::cout << "ConcreteProductB2::operationB()" << std::endl; } }; // 抽象工厂类 class AbstractFactory { public: virtual AbstractProductA* createProductA() = 0; virtual AbstractProductB* createProductB() = 0; }; // 具体工厂类 1 class ConcreteFactory1 : public AbstractFactory { public: AbstractProductA* createProductA() { return new ConcreteProductA1(); } AbstractProductB* createProductB() { return new ConcreteProductB1(); } }; // 具体工厂类 2 class ConcreteFactory2 : public AbstractFactory { public: AbstractProductA* createProductA() { return new ConcreteProductA2(); } AbstractProductB* createProductB() { return new ConcreteProductB2(); } }; int main() { AbstractFactory* factory1 = new ConcreteFactory1(); AbstractProductA* productA1 = factory1->createProductA(); AbstractProductB* productB1 = factory1->createProductB(); productA1->operationA(); // 输出:ConcreteProductA1::operationA() productB1->operationB(); // 输出:ConcreteProductB1::operationB() AbstractFactory* factory2 = new ConcreteFactory2(); AbstractProductA* productA2 = factory2->createProductA(); AbstractProductB* productB2 = factory2->createProductB(); productA2->operationA(); // 输出:ConcreteProductA2::operationA() productB2->operationB(); // 输出:ConcreteProductB2::operationB() return 0; } ``` 在上面的示例代码中,我们定义了两个抽象产品类 `AbstractProductA` 和 `AbstractProductB`,以及四个具体产品类 `ConcreteProductA1`、`ConcreteProductA2`、`ConcreteProductB1` 和 `ConcreteProductB2`。然后,我们定义了一个抽象工厂类 `AbstractFactory`,它包含两个纯虚函数,用于创建不同类型的产品对象。最后,我们定义了两个具体工厂类 `ConcreteFactory1` 和 `ConcreteFactory2`,它们分别实现了 `AbstractFactory` 中定义的纯虚函数,用于创建具体的产品对象。 在 `main` 函数中,我们首先创建了一个 `ConcreteFactory1` 对象,然后使用它创建了一个 `ConcreteProductA1` 和一个 `ConcreteProductB1` 对象,并调用了它们的成员函数。然后,我们创建了一个 `ConcreteFactory2` 对象,使用它创建了一个 `ConcreteProductA2` 和一个 `ConcreteProductB2` 对象,并调用了它们的成员函数。 通过这种方式,我们可以轻松地创建一系列相关或依赖对象的家族,并且无需指定它们具体的类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值