抽象工厂模式

1、应用场景

一般适用于产品组合产品族变化不大的情况。
优点:
(1)封装了产品的创建,使得不需要知道具体是哪种产品,只需要知道是哪个工厂就行了。
(2)可以支持不同类型的产品,使得模式灵活性更强。
(3)可以非常方便的使用一族中间的不同类型的产品。
缺点:
(1)结构太过臃肿,如果产品类型比较多,或者产品族类比较多,就会非常难于管理。
(2)每次如果添加一组产品,那么所有的工厂类都必须添加一个方法,这样违背了开放-封闭原则。

2、原理

2.1 概述

充分利用面对对象变成继承的特性,定义抽象对象,在抽象对象中,定义相关的接口,当实体对象需要创建时,就继承抽象对象的接口,在该接口下,实现对其他对象的操作。

2.2 设计步骤:

(1) 创建抽象工厂类,在类中定义创造产品接口;
(2)创建抽象产品类,在类中定义产品实现方法;
(3)继承抽象工厂类,定义实际工厂类,在实际工厂类上实现工厂创造产品的方法(用new创建新产品);
(4)继承抽象产品类,定义实际产品类,在实际产品类中定义实现产品和操作产品的方法;

3、UML类图

4、代码实现

4.1 C++

#include <iostream>

using namespace std;
class ProductA;
class AbstractProductA
{
public:
    AbstractProductA();
    virtual ~AbstractProductA();
    virtual void OperationA()=0;
};

AbstractProductA::AbstractProductA()
{
};
AbstractProductA::~AbstractProductA()
{
};

class ProductA: public AbstractProductA
{
    public:
    ProductA(){};
    ~ProductA(){};
    void OperationA()
    {
        cout<<"ProductA"<<endl;
    };
};

class AbstractFactory
{
public:
    AbstractFactory();
    virtual ~AbstractFactory();

    virtual AbstractProductA *CreatProductA()=0;
};
AbstractFactory::AbstractFactory()
{
};
AbstractFactory::~AbstractFactory()
{
};
class Factory_1: public AbstractFactory
{
    public:
        Factory_1(){};
        ~Factory_1(){};

	    AbstractProductA *CreatProductA()
	    {
		AbstractProductA * temp =NULL;
		temp= new ProductA();
		return temp;
	    };
};

int main()
{
    AbstractFactory *Factory1 = new Factory_1();
    AbstractProductA *ProductA1=  Factory1->CreatProductA();
    ProductA1->OperationA();

}

4.2 python


class AbstractProductA():
    def __init__(self):
        pass
    
    def CreateProductA(self):
        pass 

class ProductA(AbstractProductA):
    def ProductA_Des(self):
        print("Create Product\n")

class AbstractFactory():
    def __init__(self):
        pass
    def CreateProduct(self):
        pass

class Factory(AbstractFactory):
    def CreateProduct():
        temp = ProductA()
        return temp

if __name__ == "__main__": 
    Factory_1 = Factory()
    Product_1 = Factory.CreateProduct()
    Product_1.ProductA_Des()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值