分享

抽象工厂模式

 ThinkfunQd 2018-05-13

在农场系统的实现

//两种抽象产品:水果、蔬菜

public interface Fruit

{

}

public interface Veggie

{

}

//四种具体产品:北方水果,热带水果,北方蔬菜,热带蔬菜

//Northern Fruit

public class NorthernFruit implements Fruit

{

private String name;

public NorthernFruit(String name)

{

}

public String getName()

{

return name;

}

public void setName(String name)

{

this. name = name;

}

}

//TropicalFruit

public class TropicalFruit implements Fruit

{

private String name;

public TropicalFruit(String name)

{

}

public String getName()

{

return name;

}

public void setName(String name)

{

this. name = name;

}

}

//NorthernVeggie

public class NorthernVeggie implements Veggie

{

private String name;

public NorthernVeggie(String name)

{

}

public String getName()

{

return name;

}

public void setName(String name)

{

this. name = name;

}

}

//TropicalVeggie

public class TropicalVeggie implements Veggie

{

private String name;

public TropicalVeggie(String name)

{

}

public String getName()

{

return name;

}

public void setName(String name)

{

this. name = name;

}

}

//抽象工厂角色

public interface Gardener

{

public Fruit createFruit(String name);

public Veggie createVeggie(String name);

}

//具体工厂角色:北方工厂,热带角色

public class NorthernGardener implements Gardener

{

public Fruit createFruit(String name)

{

return new NorthernFruit(name);

}

public Veggie createVeggie(String name)

{

return new NorthernVeggie(name);

}

}

public class TropicalGardener implements Gardener

{

public Fruit createFruit(String name)

{

return new TropicalFruit(name);

}

public Veggie createVeggie(String name)

{

return new TropicalVeggie(name);

}

}

这样客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象。

第二个例子:C++实现

例子:数据库访问程序设计,不同的数据库访问方式可能不一样,

为了抽象对对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现

#include

using namespace std;

//用户表接口

class IUser

{

public:

virtual void Insert() = 0;

virtual void GetUser() = 0;

};

//SqlServer数据库访问User表

class SqlServerUser : public IUser

{

public:

void Insert()

{

cout<<'在SQL Server中给User表增加一条记录'<

}

void GetUser()

{

cout<<'在SQL Server中给User表获取一条记录'<

}

};

//Access数据库访问User表

class AccessUser : public IUser

{

public:

void Insert()

{

cout<<'在Access中给User表增加一条记录'<

}

void GetUser()

{

cout<<'在Access中User表获取一条记录'<

}

};

//Department表接口

class IDepartment

{

public:

virtual void Insert() = 0;

virtual void GetDepartment() = 0;

};

//SqlServer数据库访问Department表

class SqlServerDepartment : public IDepartment

{

public:

void Insert()

{

cout<<'在SQL Server中给Department表增加一条记录'<

}

void GetDepartment()

{

cout<<'在SQL Server中Department获取一条记录'<

};

};

//Access数据库访问Department表

class AccessDepartment : public IDepartment

{

public:

void Insert()

{

cout<<'在Access中给Department表增加一条记录'<

}

void GetDepartment()

{

cout<<'在Access中Department获取一条记录'<

};

};

//抽象工厂接口

class IFactory

{

public:

virtual IUser* CreateUser() = 0;

virtual IDepartment* CreateDepartment() = 0;

};

//SqlServer工厂实现

class SqlServerFactory : public IFactory

{

IUser* CreateUser()

{

return new SqlServerUser();

}

IDepartment* CreateDepartment()

{

return new SqlServerDepartment();

}

};

//Access工厂实现

class AccessFactory : public IFactory

{

IUser* CreateUser()

{

return new AccessUser();

}

IDepartment* CreateDepartment()

{

return new AccessDepartment();

}

};

int main()

{

//创建工厂

IFactory * pFactory = NULL;

IUser * pUser = NULL;

IDepartment * pDepartment = NULL;

int choise;

cout<<'选择数据库:';

cin>>choise;

switch(choise)

{

case 1:

pFactory= new SqlServerFactory(); //创建SqlServer访问的工厂

break;

case 2:

pFactory = new AccessFactory(); //创建Access访问的工厂

break;

}

//一致的操作

pUser = pFactory->CreateUser();

pDepartment= pFactory->CreateDepartment();

pUser->Insert();

pUser->GetUser();

pDepartment->Insert();

pDepartment->GetDepartment();

return 0;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约