上一篇文章《 <工厂方法> 比 <简单工厂> 多了啥 》介绍了简单工厂模式和工厂方法模式。本篇文章则讲最后一个工厂----抽象工厂。若是对工厂方法比较模糊的,能够返回上一篇文章复习。接下来先看故事。html
又通过三年以后,中国已经愈来愈国际化了,不少日本人来中国留学也带来了本土的猫和狗。一旦他们留学回去以后,就把这些动物送到了动物流浪工厂中。此时,个别对小日本有抵触的人并不想为这些日本的动物喂食,因而拉起一部分人到工厂去抗议,要求本身的食物只给中国的动物吃,把日本的动物赶出去。厂长一看这么多人抗议,没办法,只能把动物分国籍了,因而把中国流浪动物在一个工厂,日本流浪动物在另一个工厂。
某一天,一位原本认为日本的动物也是动物的爱心人士看到了安培晋三参拜靖国神社的新闻,因而她要求原来喂养的日本流浪动物 切换 到中国流浪动物,以下图所示,她只要切换一个工厂就能够达成心愿。
sql
对比一下业务场景
数据库
抽象工厂模式:为建立一组相关或相互依赖的对象提供一个接口,并且无需指定他们的具体类。(如上图,提供了数据库抽象工厂,而无需指定具体数据库给客户端)oracle
针对以上两个问题,来进行解决。1.可不可动态实例化?2. 增长类是可扩展的,可是修改三个工厂是否能够去掉?sqlserver
答案是:能够的,利用反射+配置文件3d
咱们将工厂干掉,利用数据库Context类来动态实例化具体的功能类(产品类)。利用反射来实例化相关的实例,而不是让工厂去实例化,实例化格式以下:
Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”)code
数据库Context代码以下:server
class 数据库Context { private static readonly string db=ConfigurationManager.Appsettings["DB"]; private static readonly string AssemblyName="程序集名称"; public static IUser 增长用户() { string className=AssemblyName+".User"; return (IUser)Assembly.Load(AssemblyName).CreateInstance(className); } //其余相似 }
介绍完了抽象工厂模,可是它跟工厂方法的差别在哪里?htm