设计模式-抽象工厂(Abstract Factory)

应用场景:

1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。

2、系统中有多于一个的产品族,而每次只使用其中某一产品族。

3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。

4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

优点:

1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

 

缺点:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

简单实现:

#include <string>

#include <iostream>

#include <vector>

using namespace std;

//用户抽象接口

class IUser

{

public:

virtualvoid GetUser()=0;

virtualvoid InsertUser()=0;

//部门抽象接口

class IDepartment

{

public:

virtualvoid GetDepartment()=0;

virtualvoid InsertDepartment()=0;

//ACCESS 用户

class CAccessUser : public IUser

{

public:

virtualvoid GetUser()

{

cout<<"AccessGetUser"<<endl;

}

virtualvoid InsertUser()

{

cout<<"AccessInsertUser"<<endl;

}

//ACCESS 部门

class CAccessDepartment : public IDepartment

{

public:

virtualvoid GetDepartment()

{

cout<<"AccessGetDepartment"<<endl;

}

virtualvoid InsertDepartment()

{

cout<<"AccessInsertDepartment"<<endl;

}

//SQL 用户

class CSqlUser : public IUser

{

public:

virtualvoid GetUser()

{

cout<<"SqlUser"<<endl;

}

virtualvoid InsertUser()

{

cout<<"SqlUser"<<endl;

}

//SQL 部门类

class CSqlDepartment: public IDepartment

{

public:

virtualvoid GetDepartment()

{

cout<<"sqlgetDepartment"<<endl;

}

virtualvoid InsertDepartment()

{

cout<<"sqlinsertdepartment"<<endl;

}

//抽象工厂

class IFactory

{

public:

virtualIUser* CreateUser()=0;

virtualIDepartment* CreateDepartment()=0;

//ACCESS 工厂

class AccessFactory : public IFactory

{

public:

virtualIUser* CreateUser()

{

returnnew CAccessUser();

}

virtualIDepartment* CreateDepartment()

{

returnnew CAccessDepartment();

}

//SQL 工厂

class SqlFactory : public IFactory

{

public:

virtualIUser* CreateUser()

{

returnnew CSqlUser();

}

virtualIDepartment* CreateDepartment()

{

returnnew CSqlDepartment();

}

客户端:

int main()

{

IFactory*factory= new SqlFactory();

IUser*user=factory->CreateUser();

IDepartment*depart = factory->CreateDepartment();

User->GetUser();

depart->GetDepartment();

return0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值