• 大话设计模式C++实现-第15章-抽象工厂模式


    一、UML图



    二、概念

    抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类。


    三、包括的角色

    (1)抽象工厂

    (2)详细工厂:包含详细工厂1和详细工厂2。详细工厂1用于生产详细产品A1和详细产品B1,详细工厂2用于生产详细产品A2和详细产品B2;

    (3)抽象产品:包含抽象产品A和抽象产品B。

    (4)详细产品:包含抽象产品A所相应的详细产品A1和A2。以及抽象产品B所相应的详细产品B1和B2.

    说明:在《大话设计模式》中,上述的1和2分别代表Sqlserver数据库和Access数据库。上述的A和B分别代表数据库中的User表和Department表。


    四、优势

    (1)抽象工厂模式是对工厂方法模式的改进。

    用于处理产品不仅仅有一类的情况(工厂方法模式下。产品仅仅有User这一类,而抽象工厂模式下。产品包含User和Department两类)。

    (2)在下面情况下应当考虑使用抽象工厂模式

    •  一个系统不应当依赖于产品类实例怎样被创建、组合和表达的细节,这对于全部形态的工厂模式都是重要的。
    • 这个系统有多于一个的产品族。而系统仅仅消费当中某一产品族。
    • 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。

    • 系统提供一个产品类的库,全部的产品以相同的接口出现,从而使client不依赖于实现。

    (3)解读:

    在上例中。产品族包括两个:1和2,也就是Sqlserver数据库和Access数据库。

    每一个产品族里面又包括两类产品:A和B,也就是User表和Department表。而每一个产品族中的产品要一起使用,就是说产品族1中的两类产品A和B要一起使用,也就是说在SqlServer数据库中SqlServerUser表和SqlServerDepartment表要一起使用,Access数据库同理。

    五、C++实现

    (1)代码

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    
    //数据库表项:User
    class User
    {
    private:
    	int id;
    	string name;
    public:
    	int getID()
    	{
    		return id;
    	}
    	string getName()
    	{
    		return name;
    	}
    	void setID(int ID)
    	{
    		this->id=ID;
    	}
    	void setName(string NAME)
    	{
    		this->name=NAME;
    	}
    };
    
    
    //数据库表项:Department
    class Department
    {
    private:
    	int id;
    	string name;
    public:
    	int getID()
    	{
    		return id;
    	}
    	string getName()
    	{
    		return name;
    	}
    	void setID(int ID)
    	{
    		this->id=ID;
    	}
    	void setName(string NAME)
    	{
    		this->name=NAME;
    	}
    };
    
    
    
    //抽象产品A:IUser
    class IUser
    {
    public:
    	virtual void Insert(User user)=0;
    	virtual User* GetUser(int id)=0;
    };
    //详细产品A1:SqlserverUser
    class SqlserverUser:public IUser
    {
    public:
    	void Insert(User user)
    	{
    		cout<<"在SQL Server中给User表添加了一条记录"<<endl;
    	}
    	User* GetUser(int id)
    	{
    		cout<<"在SQL Server中依据ID得到User表一条记录"<<endl;
    		return NULL;
    	}
    };
    //详细产品A2:AccessUser
    class AccessUser:public IUser
    {
    public:
    	void Insert(User user)
    	{
    		cout<<"在Access中给User表添加了一条记录"<<endl;
    	}
    	User* GetUser(int id)
    	{
    		cout<<"在Access中依据ID得到User表一条记录"<<endl;
    		return NULL;
    	}
    };
    
    
    //抽象产品B:IDepartment
    class IDepartment
    {
    public:
    	virtual void Insert(Department department)=0;
    	virtual Department* GetDepartment(int id)=0;
    };
    //详细产品B1:SqlserverDepartment
    class SqlserverDepartment:public IDepartment
    {
    public:
    	void Insert(Department department)
    	{
    		cout<<"在Sql Server中给Department表加入了一条记录"<<endl;
    	}
    	Department* GetDepartment(int id)
    	{
    		cout<<"在SQL Server中依据ID得到Department表的一条记录"<<endl;
    		return NULL;
    	}
    };
    //详细产品B2:AccessDepartment
    class AccessDepartment:public IDepartment
    {
    public:
    	void Insert(Department department)
    	{
    		cout<<"在Access中给Department表加入了一条记录"<<endl;
    	}
    	Department* GetDepartment(int id)
    	{
    		cout<<"在Access中依据ID得到Department表的一条记录"<<endl;
    		return NULL;
    	}
    };
    
    
    
    //抽象工厂:IFactory
    class IFactory
    {
    public:
    	virtual IUser* CreateUser()=0;
    	virtual IDepartment* CreateDepartment()=0;
    };
    //详细工厂1:SqlServerFactory
    class SqlserverFactory:public IFactory
    {
    public:
    	IUser* CreateUser()
    	{
    		return new SqlserverUser;
    	}
    
    	IDepartment* CreateDepartment()
    	{
    		return new SqlserverDepartment;
    	}
    };
    //详细工厂2:AccessFactory
    class AccessFactory:public IFactory
    {
    public:
    	IUser* CreateUser()
    	{
    		return new AccessUser;
    	}
    
    	IDepartment* CreateDepartment()
    	{
    		return new AccessDepartment;
    	}
    };
    
    
    
    //client
    void  main()
    {
    	User user;
    	Department department;
    
    	//ConcreteFactory1
    	IFactory* factory=NULL;
    	factory=new SqlserverFactory;
    	
    	//ProductA1
    	IUser* iu=NULL;
    	iu=factory->CreateUser();
    	iu->Insert(user);
    	iu->GetUser(1);
    
    	//ProductB1
    	IDepartment* id=NULL;
    	id=factory->CreateDepartment();
    	id->Insert(department);
    	id->GetDepartment(1);
    
    	if(factory!=NULL)
    	{
    		delete factory;
    		factory=NULL;
    	}
    	if(iu!=NULL)
    	{
    		delete iu;
    		iu=NULL;
    	}
    	if(id!=NULL)
    	{
    		delete id;
    		id=NULL;
    	}
    
    	system("pause");
    }
    

    (2)执行截图


  • 相关阅读:
    ssd 的anchor生成详解
    Qt小技巧8.利用反射机制通过类名创建Qt对象
    项目经验2.需求才是王道
    Qt实战12.可自由展开的ToolBox
    Qt实战11.进程窗口集成之假装写了个第三方软件
    Qt小技巧7.Qt4集成fusion风格
    Qt杂谈3.快速体验Qt for Android(windows平台)
    Qt实战10.支持最小化和最大化的QDockWidget
    gitlab 拉取远程分支代码
    CentOS7下用jdk1.7编译hadoop-2.7.1全过程详解
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6999244.html
Copyright © 2020-2023  润新知