设计模式 工厂模式

发布于:2024-05-01 ⋅ 阅读:(27) ⋅ 点赞:(0)

简单工厂模式简介

简单工厂模式通过一个专门的工厂类来负责对象的创建,客户端只需要提供工厂类需要的参数,然后工厂类就会根据这些参数来创建相应的对象,客户无需了解对象创建的逻辑。

简单工厂模式结构

工厂类(Factory):负责创建对象的类。它包含一个方法,根据客户端传递的参数来决定创建哪种类型的对象。

产品类(Product):被创建的对象的抽象类或接口。它定义了对象的基本属性和行为,具体的产品类将实现这些抽象方法。

具体产品类(Concrete Product):实现了产品类的具体子类。它是工厂类创建的对象的实际类型。

枚举:用于规范传参种类,可以不写。
在这里插入图片描述

简单工厂模式实现

#include <iostream>
#include <string>

// 产品类 - 抽象类或接口
class Product 
{
public:
    virtual void use() = 0;
};

// 具体产品类A
class ConcreteProductA : public Product 
{
public:
    void use() override 
    {
        std::cout << "使用A产品" << std::endl;
    }
};

// 具体产品类B
class ConcreteProductB : public Product 
{
public:
    void use() override 
    {
        std::cout << "使用B产品" << std::endl;
    }
};

// 工厂类
class Factory 
{
public:
    // 根据类型创建产品
    static Product* createProduct(const std::string& type) 
    {
    	// 也可用case语句--效率更高
        if (type == "A") 
        {
            return new ConcreteProductA();
        } 
        else if (type == "B") 
        {
            return new ConcreteProductB();
        } 
        else 
        {
            return nullptr; // 可以考虑抛出异常或返回默认产品
        }
    }
};

int main() 
{
    // 使用工厂创建产品
    Product* productA = Factory::createProduct("A");
    if (productA) 
    {
        productA->use();
        delete productA;
    }

    Product* productB = Factory::createProduct("B");
    if (productB) 
    {
        productB->use();
        delete productB;
    }

    return 0;
}

工厂模式简介

在简单工厂模式的基础上进行了优化,从简单工厂模式的类图或代码中可以看出,如果程序设计者想设计新的产品,就要在工厂类中增加新的代码,这样如果更新产品较多就会造成工厂类代码长度过长,且因为要修改已有的代码,开发封闭原则实现程度较低(绝对的开放封闭不存在)。 使用工厂模式则可以解决这些问题。

工厂模式结构

抽象工厂(Abstract Factory):定义了创建产品对象的接口。

具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品对象。

抽象产品(Abstract Product):定义了产品的基本属性和行为。

具体产品(Concrete Product):实现了抽象产品接口,是具体的产品对象。

每种具体工厂对应一个具体产品。

在这里插入图片描述

工厂模式实现

#include <iostream>
#include <memory>

// 抽象产品
class Product 
{
public:
    virtual void operation() = 0;
    virtual ~Product() {}
};

// 具体产品 A
class ConcreteProductA : public Product 
{
public:
    void operation() override 
    {
        std::cout << "具体产品 A 的操作" << endl ;
    }
};

// 具体产品 B
class ConcreteProductB : public Product 
{
public:
    void operation() override 
    {
        std::cout << "具体产品 B 的操作" << endl;
    }
};

// 抽象工厂
class Factory 
{
public:
    virtual std::unique_ptr<Product> createProduct() = 0;
    virtual ~Factory() {}
};

// 具体工厂 A
class ConcreteFactoryA : public Factory {
public:
    std::unique_ptr<Product> createProduct() override 
    {
        return std::make_unique<ConcreteProductA>();
    }
};

// 具体工厂 B
class ConcreteFactoryB : public Factory 
{
public:
    std::unique_ptr<Product> createProduct() override 
    {
        return std::make_unique<ConcreteProductB>();
    }
};

int main() 
{
    // 创建工厂 A
    std::unique_ptr<Factory> factoryA = std::make_unique<ConcreteFactoryA>();
    // 使用工厂 A 创建产品 A
    std::unique_ptr<Product> productA = factoryA->createProduct();
    productA->operation();

    // 创建工厂 B
    std::unique_ptr<Factory> factoryB = std::make_unique<ConcreteFactoryB>();
    // 使用工厂 B 创建产品 B
    std::unique_ptr<Product> productB = factoryB->createProduct();
    productB->operation();

	delete factoryA ;
	delete productA ;
	delete factoryB ;
	delete productB ; 

    return 0;
}

抽象工厂模式简介

和工厂模式结构类似,只不过多做了一层虚拟接口类。抽象工厂和工厂的区别在于选择使用上:
工厂模式使用情境:
1当一个类不知道它所必须创建的对象的类的时候
2当一个类希望由它的子类来指定它所创建的对象的时候
3当类将创建对象的职责委托给多个帮助子类中的某一个,并且你望将哪一个帮助子类是代理者这一信息局部化的时候,
抽象工厂模式使用情境:
1当需要创建的对象是一系列相互关联或相互依赖的产品族的时候
2当系统需要独立于它的产品的创建、组合和表示的时候。
3当一个系统要由多个产品系列中的一个来配置时。

抽象工厂模式结构

抽象工厂(图中 工厂接口类): 这是工厂模式的核心,它定义了一个创建一组产品的接口。

具体工厂(图中 具体工厂): 实现了抽象工厂接口,生产一组具体的产品。

抽象产品(图中 产品–接口类): 定义了一个产品对象的接口。

具体产品(图中 部件A1A2…C2C3): 实现了抽象产品接口,是具体工厂创建的具体对象。

在这里插入图片描述

抽象工厂模式实现

// 抽象产品A
class AbstractProductA 
{
public:
    virtual std::string Operation() const = 0;
};

// 具体产品A1
class ConcreteProductA1 : public AbstractProductA 
{
public:
    std::string Operation() const override 
    {
        return "ConcreteProductA1";
    }
};

// 具体产品A2
class ConcreteProductA2 : public AbstractProductA 
{
public:
    std::string Operation() const override 
    {
        return "ConcreteProductA2";
    }
};

// 抽象产品B
class AbstractProductB 
{
public:
    virtual std::string OperationB() const = 0;
};

// 具体产品B1
class ConcreteProductB1 : public AbstractProductB 
{
public:
    std::string OperationB() const override
    {
        return "ConcreteProductB1";
    }
};

// 具体产品B2
class ConcreteProductB2 : public AbstractProductB 
{
public:
    std::string OperationB() const override 
    {
        return "ConcreteProductB2";
    }
};

// 抽象工厂
class AbstractFactory 
{
public:
    virtual AbstractProductA* CreateProductA() const = 0;
    virtual AbstractProductB* CreateProductB() const = 0;
};

// 具体工厂1
class ConcreteFactory1 : public AbstractFactory 
{
public:
    AbstractProductA* CreateProductA() const override
    {
        return new ConcreteProductA1();
    }

    AbstractProductB* CreateProductB() const override 
    {
        return new ConcreteProductB1();
    }
};

// 具体工厂2
class ConcreteFactory2 : public AbstractFactory 
{
public:
    AbstractProductA* CreateProductA() const override 
    {
        return new ConcreteProductA2();
    }

    AbstractProductB* CreateProductB() const override 
    {
        return new ConcreteProductB2();
    }
};

// 客户端代码
void ClientCode(const AbstractFactory& factory) 
{
    const auto product_a = factory.CreateProductA();
    const auto product_b = factory.CreateProductB();
    std::cout << product_a->Operation() << "\n";
    std::cout << product_b->OperationB() << "\n";
    delete product_a;
    delete product_b;
}

int main() 
{
    std::cout << "Client: Testing client code with the first factory type:\n";
    ConcreteFactory1 factory1;
    ClientCode(factory1);
    std::cout << "\n";

    std::cout << "Client: Testing the same client code with the second factory type:\n";
    ConcreteFactory2 factory2;
    ClientCode(factory2);

    return 0;
}