工厂模式细分三种:简单工厂模式、工厂模式、抽象工厂模式。
工厂模式相当于抽象了简单工厂模式的工厂类,而抽象工厂模式在工厂模式的基础上加上了产品族的概念。我选用的是抽象工厂模式来完成本次作业。
定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
使用条件:1)系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。2)系统一次只可能消费其中某一族产品,即同族的产品一起使用
功能:抽象工厂模式的一个主要功能是它能够隔离要生成的具体产品类, 由于这些类的实际类名部被隐藏在工厂内部,因此客户端根本不需要关心如何对它们进行实例化的细节。每种设计模式都是针对特定问题的解决方案,而抽象工厂模式面临的问题则是当涉及到有多个产品等级结构寸,如何更好地进行软件体系结构的设计。
场景:对数据库中的表进行修改
结构图:
1) User表的定义:
2) 定义接口
3) 实现对mysql中User进行操作的类
实现对oracle中User进行操作的类
4) 定义一个工厂接口,用于生产访问User表的对象
5) 生产mysqlUser对象的mysql工厂类
生产oracleUser对象的oracle工厂类
6) 用户测试类
优点:
1)抽象工厂模式最大的好处是易于交换产品系列,由于具体工厂类,例如 IFactory factory=new OracleFactory(); 在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。不管是任何人的设计都无法去完全防止需求的更改,或者项目的维护,那么我们的理想便是让改动变得最小、最容易,例如我现在要更改以上代码的数据库访问时,只需要更改具体的工厂即可。2)抽象工厂模式的另一个好处就是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品实现类的具体类名也被具体的工厂实现类分离,不会出现在客户端代码中。就像我们上面的例子,客户端只认识IUser和ILogin,至于它是MySQl里的表还是Oracle里的表就不知道了。
缺点:
1)如果你的需求来自增加功能,比如增加Login表,就有点太烦了。首先需要增加 ILogin,mysqlLogin,oracleLogin。 然后我们还要去修改工厂类: sqlFactory, mysqlFactory, oracleFactory 才可以实现,需要修改三个类,实在是有点麻烦。2)还有就是,客户端程序肯定不止一个,每次都需要声明sqlFactory factory=new MysqlFactory(), 如果有100个调用数据库的类,就需要更改100次sqlFactory factory=new oracleFactory()。