《大话设计模式》读书笔记之C++实现--chapter15抽象工厂模式

#include <iostream>
using namespace std;

//抽象产品类
class AbstractProduct{
public:
    virtual void ProductFunction() = 0;     //子类可以重写该函数来实现不同子类的特有功能
    virtual ~AbstractProduct(){}
};

//具体产品类,有实现自己功能的成员函数
class ConcreteProductA:public AbstractProduct{
public:
    void ProductFunction()
    {
        cout << "ConcreteProductA do its function" << endl;
    }
};

class ConcreteProductB:public AbstractProduct{
public:
    void ProductFunction()
    {
        cout << "ConcreteProductB do its function" << endl;
    }
};

//抽象工厂类,可以生产不同的产品
class AbstractFactory{
public:
    virtual AbstractProduct* CreateProduct() = 0;
    virtual ~AbstractFactory(){}
};

class ConcreteFactoryA:public AbstractFactory{
public:
    AbstractProduct* CreateProduct()
    {
        return new ConcreteProductA();
    }
};

class ConcreteFactoryB:public AbstractFactory{
public:
    AbstractProduct* CreateProduct()
    {
        return new ConcreteProductB();
    }
};

int main(int argc,char** argv)
{
    AbstractFactory *factoryA = new ConcreteFactoryA();
    AbstractFactory *factoryB = new ConcreteFactoryB();
    AbstractProduct *productA = factoryA->CreateProduct();
    AbstractProduct *productB = factoryB->CreateProduct();
    productA->ProductFunction();
    productB->ProductFunction();
    return 0;
}

以下是书中具体的一个DB例子

#include <iostream>
using namespace std;

class User{

};

class IUser{
public:
    virtual void Insert(User user) = 0;
    virtual void GetId(User user) = 0;
};

class SqlServerUser:public IUser{
public:
    void Insert(User user)
    {
        cout << "use sqlserver insert into user" << endl;
    }
    void GetId(User user)
    {
        cout << "use sqlserver get user id " << endl;
    }
};

class AccessUser:public IUser{
public:
    void Insert(User user)
    {
        cout << "use AccessUser insert into user" << endl;
    }
    void GetId(User user)
    {
        cout << "use AccessUser get user id " << endl;
    }
};

class IFactory{
public:
    virtual IUser* CreateUser() = 0;
};

class SqlServerFactory:public IFactory{
public:
    IUser* CreateUser()
    {
        return new SqlServerUser();
    }
};

class AcceseFactory:public IFactory{
public:
    IUser* CreateUser()
    {
        return new AccessUser();
    }
};

int main(int argc,char** argv)
{
    User user;
    IFactory* access = new AcceseFactory();
    IUser* accessUser = access->CreateUser();
    accessUser->Insert(user);
    return 0;
}

利用简单工厂来改进抽象工厂,也就是将选择工厂转移到类中决定,而不必通过继承的各种子类来决定

#include <iostream>
#include <string>
using namespace std;

//抽象产品类
class AbstractProduct{
public:
    virtual void ProductFunction() = 0;     //子类可以重写该函数来实现不同子类的特有功能
    virtual ~AbstractProduct(){}
};

//具体产品类,有实现自己功能的成员函数
class ConcreteProductA:public AbstractProduct{
public:
    void ProductFunction()
    {
        cout << "ConcreteProductA do its function" << endl;
    }
};

class ConcreteProductB:public AbstractProduct{
public:
    void ProductFunction()
    {
        cout << "ConcreteProductB do its function" << endl;
    }
};

//产品枚举类,代表不同产品
enum ProductType{
    ConcreteA,
    ConcreteB
};

//抽象工厂类,可以生产不同的产品
class Factory{
public:
    static AbstractProduct* CreateProduct()
    {
        switch (m_ProductType) {
        case ConcreteA:
            return new ConcreteProductA();
            break;
        case ConcreteB:
            return new ConcreteProductB();
            break;
        default:
            return nullptr;
            break;
        }
    }

private:
    static ProductType m_ProductType;
};

//在类外初始化static数据成员并决定生成哪种产品
ProductType Factory::m_ProductType = ConcreteB;


int main(int argc,char** argv)
{
    AbstractProduct *product = Factory::CreateProduct();
    product->ProductFunction();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值