本文只讲解3中模式的对比,不讲解详情
简单工厂模式
核心方法: 工厂类的CreateOperation(String),让其通过多态,
创造相应实例。
优点: 增加各种复杂的运算时,工厂类可以封装变化,让客户端更加方便的实现运算功能。
缺点: 违背开放-封闭原则。
使用场景: 比如实现运算功能的时候,需求可能会很多,很容易变化。
工厂模式
简单工厂模式中的工厂类与分支耦合,那么根据依赖倒置原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有要生产具体类的工厂,就去实现这个接口,这样一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生产对象的工厂。于是,当要新增“求m的n次方”的时候,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。
优点:
- 只是扩展变了变化,符合开方-封闭原则。工厂方法克服了简单工厂违背开方-封闭原则的缺点
- 降低了客户端和产品对象的耦合。工厂方法是简单工厂的进一步抽象和推广。
缺点:
- 客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。即,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
- 由于新增一个产品时,就需要增加一个产品工厂的类,增加了额外的开发量。
抽象工厂
提供一个创建一系列相关
或相互依赖
的接口,而无需指定它们具体的类。
优点: 易于交换产品系列,这是最大的优点。例如IFactory factory=new AccessFactory(),只在初始化的时候出现一次,这样改变一个应用的具体工厂变得很容易,只需要改变具体工厂即可使用不同的产品配置。如果现在要改变数据库访问,只需要修改具体工厂就行了。
-
它让具体的创建过程和客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。
-
是开放-封闭原则、依赖倒转原则的良好运用。其实,这一点和工厂模式一样。
缺点: 如果要增加一个Project项目表(一个系列),至少要添加3个类,IProject,SqlServerProject,AccessProject,还需要修改IFactory,SqlServerFactory,AccessFactory,极不方便。用反射+抽象工厂解决。
工厂模式和抽象工厂模式的区别
- 工厂模式 适合具体功能类ConcreteProductX只有一个系列的情况,例如只有一个User类和User操作类的时候。
- 抽象工厂模式 适合一个具体功能类ConcreteProductX有至少两个系列的情况,现在有很多表,而sql server和access又是不同的分类,抽象工厂模式 适合解决涉及到多个产品系列的问题。