设计模式之工厂模式

  最近在一个同事搭建的小框架下完成一个小的功能实现,我总是感觉同事设计的框架有些问题,但总也说不出个一二三来,最明显的感觉是:在此框架下,我能够实现该功能,但实现后,整个代码的可维护性和可扩展性都不好,这使我意识到是不是这个框架的设计有问题。所以找了本大师们大作《设计模式》,看了一个模式后整个人都感觉不好了。硬生生把我渴望学习的热情之火给熄灭了,看来这本书的确不适合我这种入门级的菜鸟学习啊。没办法,在网上找了些前辈大牛们的学习心得,总算是看懂了点。在这里写博客不是为了炫耀自己有多牛(菜鸟一个),而是为了把学习的体会记下来,用于加深理解和以后查阅方便,有不正确的地方还请大家多多指教。

 

工厂模式是设计模式里面的创建型模式,包括简单工厂、工厂方法、抽象工厂三种模式。

1、简单工厂:

[ code=C/C++ ]

// 用户抽象接口   
class IUser   
{   
public :   
virtual void GetUser()=0;   
virtual void InsertUser()=0;   
};   

//ACCESS 用户   
class CAccessUser : public IUser   
{   
public:   
virtual void GetUser()   
{   
cout<<"Access GetUser"<<endl;   
}   
virtual void InsertUser()   
{   
cout<<"Access InsertUser"<<endl;   
}   
};   

//SQL 用户   
class CSqlUser : public IUser   
{   
public:   
virtual void GetUser()   
{   
cout<<"Sql User"<<endl;   
}   
virtual void InsertUser()   
{   
cout<<"Sql User"<<endl;   
}   
};     

class IFactory   
{   
public:   
 static IUser* CreateUser(const std::string& userName)
 {
 if (userName=="SQL")
 {
  return new CSqlUser();
 }
 else if(userName=="ACCESS")
 {
 return new CAccessUser();
 }
 }
};    

//客户端:   
int main()   
{   
IUser* user=IFactory::CreateUser("SQL");  
user->GetUser();   
return 0;   
}  

[ /code]

2、工厂方法:

[code = C/C++]

class IUser   
{   
public :   
virtual void GetUser()=0;   
virtual void InsertUser()=0;   
};   

//ACCESS 用户   
class CAccessUser : public IUser   
{   
public:   
virtual void GetUser()   
{   
cout<<"Access GetUser"<<endl;   
}   
virtual void InsertUser()   
{   
cout<<"Access InsertUser"<<endl;   
}   
};   

//SQL 用户   
class CSqlUser : public IUser   
{   
public:   
virtual void GetUser()   
{   
cout<<"Sql User"<<endl;   
}   
virtual void InsertUser()   
{   
cout<<"Sql User"<<endl;   
}   
};     

// 工厂方法   
class IFactory   
{   
public:   
 virtual IUser* CreateUser()=0;
};
//ACCESS 工厂   
class AccessFactory : public IFactory   
{   
public:   
virtual IUser* CreateUser()   
{   
return new  CAccessUser();   
}      
};   

//SQL 工厂   
class SqlFactory : public IFactory   
{   
public:   
virtual IUser* CreateUser()   
{   
return new  CSqlUser();   
}      
}; 

//客户端:   
int main()   
{   IFactory* factory = new SqlFactory;
IUser* user= factory->CreateUser();
user->GetUser();   
return 0;   
}  

[/code]

3、抽象工厂

[code = C/C++]

class IUser   
{   
public :   
virtual void GetUser()=0;   
virtual void InsertUser()=0;   
};   

// 部门抽象接口   
class IDepartment   
{   
public:   
virtual void GetDepartment()=0;   
virtual void InsertDepartment()=0;   
};   

//ACCESS 用户   
class CAccessUser : public IUser   
{   
public:   
virtual void GetUser()   
{   
cout<<"Access GetUser"<<endl;   
}   
virtual void InsertUser()   
{   
cout<<"Access InsertUser"<<endl;   
}   
};   

//ACCESS 部门   
class CAccessDepartment : public IDepartment   
{   
public:   
virtual void GetDepartment()   
{   
cout<<"Access GetDepartment"<<endl;   
}   
virtual void InsertDepartment()   
{   
cout<<"Access InsertDepartment"<<endl;   
}   
};   

//SQL 用户   
class CSqlUser : public IUser   
{   
public:   
virtual void GetUser()   
{   
cout<<"Sql User"<<endl;   
}   
virtual void InsertUser()   
{   
cout<<"Sql User"<<endl;   
}   
};   

//SQL 部门类   
class CSqlDepartment: public IDepartment   
{   
public:   
virtual void GetDepartment()   
{   
cout<<"sql getDepartment"<<endl;   
}   
virtual void InsertDepartment()   
{   
cout<<"sql insertdepartment"<<endl;   
}   
};   

// 抽象工厂   
class IFactory   
{   
public:   
virtual IUser* CreateUser()=0;   
virtual IDepartment* CreateDepartment()=0;   
};   

//ACCESS 工厂   
class AccessFactory : public IFactory   
{   
public:   
virtual IUser* CreateUser()   
{   
return new  CAccessUser();   
}   
virtual IDepartment* CreateDepartment()   
{   
return new CAccessDepartment();   
}   
};   

//SQL 工厂   
class SqlFactory : public IFactory   
{   
public:   
virtual IUser* CreateUser()   
{   
return new  CSqlUser();   
}   


virtual IDepartment* CreateDepartment()   
{   
return new CSqlDepartment();   
}   
};   

//客户端:   
int main()   
{   
IFactory* factory= new SqlFactory();   
IUser* user=factory->CreateUser();   
IDepartment* depart = factory->CreateDepartment();   
user->GetUser();   
depart->GetDepartment();   
return 0;   
}  

[/code]

简单工厂的适用性:

简单工厂并不是23设计模式中的一种,但在我看来是最简单实用的一种。

使用简单工厂的优点是:

1、充分利用了多态性不管什么具体产品都返回抽象产品。
2、充分利用了封装性,内部产品发生变化时外部使用者不会受到影响。

 缺点是:如果增加了新的产品,就必须得修改工厂(Factory)。

工厂方法的适用性:

1、当一个类不知道它所必须创建的对象的类的时候

2、当一个类希望由它的子类来指定它所创建对象的时候

3、当类将创建对象的职责委托给多个帮组子类中的某一个,并且你希望将哪一个帮组子类是代理者这一信息局部化的时候

 

抽象工厂的适用性:

1、一个系统要独立于它的产品的创建  组合和表示时

2、一个系统要又多个产品系列中的一个来配置时

3、当你要强调一系列相关产品对象的设计以便进行联合使用时

4、当你提供一个产品类库,而只想显示它们的接口而不是实现时

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值