设计模式之工厂模式

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

 

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

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、当你提供一个产品类库,而只想显示它们的接口而不是实现时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随与博主沟通,第一间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随与博主沟通,第一间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随与博主沟通,第一间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值