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