在农场系统的实现 //两种抽象产品:水果、蔬菜 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; } |
|
来自: ThinkfunQd > 《待分类》