我读设计模式之简单工厂模式
2008-07-17 14:33
218 查看
书上说简单工厂模式不是23种经典设计模式中得一种。但不管怎么样,作为一种编程的思想,还是很有必要学习一下。
简单工厂模式的核心是通过建立工厂类,此工厂类根据传递的参数不同,实例化不同的具体类。这里面涉及到几部分内容:
1.工厂类:负责创建具体类实例
2.抽象类 :所有具体类的抽象父类,可以是接口,也可以是普通类,更可以是抽象类
3.具体类 :抽象类的具体实现类,一般有多个。
采用简单工厂模式的初衷是要把client端从对类的实例化中解放出来(对其隐藏具体类的实例化过程),而有专门的工厂类负责所有的具体类得实例化,而具体要实例化哪个类,则有传递的参数决定。
这样做的好处很明显:
1.对于经常要变化的内容进行封装,便于维护(封装变化点原则)
2.把Client于具体类隔离,降低耦合。
有例为证:
Example 数据库变化是经常发生的事情(原来用sql server,现在用oracle。暂时不说多数据库并存的情况,那会有另外更好的模式进行解决),如果按照通常的逻辑,我们都会写sql server数据访问类,而后在client端涉及到数据访问的地方,就对此数据访问类实例化,并做具体的动作。加入哪天要升级数据库到oracle,那么这个设计带来的将是一场噩梦:改写数据访问类,然后凡应用到此类的client均要修改.
采用简单工厂模式,可以有效脱离这种困境:
工厂类:
public class DBFactory
public abstract class DBDAL
public class SQLDAL : DBDAL
public class OraDAL : DBDAL
protected void btnShow_Click(object sender, EventArgs e)
<appSettings>
<add key="DbType" value="SQLServer"/>
<add key="SQLServer" value="server=.;database=MIS;uid=sa;pwd=MIS>
<add key="Oracle" value="Data source=oratest;uid=ivan;password=ivan"/>
</appSettings>
可以发现,上述工厂类对具体类的实现,是通过判断参数来进行区别的,虽然看起来有些不雅,但通常可以解决很多的问题。随后读得抽象工厂模式,利用发射机制可能可以有效的解决这个问题。
【实践】
WMS系统中的入库作业很多的movement Type,不同的mvt在抛转ERP时要调用不同的RFC或者进行很多不同的操作。并且,实践证明,mvt的增加/减少在无休止的进行...这样,我们必须把这个抛转的动作进行抽象封装,使得这个变化点易于维护和扩展。
如图所示:根据不同的MVT,执行不同的动作
此为一个简单的应用Demo.
SourceCode:/Files/Ivan-Yan/SimpleFactoryPattern.rar
参考文章:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html
大话设计模式
简单工厂模式的核心是通过建立工厂类,此工厂类根据传递的参数不同,实例化不同的具体类。这里面涉及到几部分内容:
1.工厂类:负责创建具体类实例
2.抽象类 :所有具体类的抽象父类,可以是接口,也可以是普通类,更可以是抽象类
3.具体类 :抽象类的具体实现类,一般有多个。
采用简单工厂模式的初衷是要把client端从对类的实例化中解放出来(对其隐藏具体类的实例化过程),而有专门的工厂类负责所有的具体类得实例化,而具体要实例化哪个类,则有传递的参数决定。
这样做的好处很明显:
1.对于经常要变化的内容进行封装,便于维护(封装变化点原则)
2.把Client于具体类隔离,降低耦合。
有例为证:
Example 数据库变化是经常发生的事情(原来用sql server,现在用oracle。暂时不说多数据库并存的情况,那会有另外更好的模式进行解决),如果按照通常的逻辑,我们都会写sql server数据访问类,而后在client端涉及到数据访问的地方,就对此数据访问类实例化,并做具体的动作。加入哪天要升级数据库到oracle,那么这个设计带来的将是一场噩梦:改写数据访问类,然后凡应用到此类的client均要修改.
采用简单工厂模式,可以有效脱离这种困境:
工厂类:
public class DBFactory
public abstract class DBDAL
public class SQLDAL : DBDAL
public class OraDAL : DBDAL
protected void btnShow_Click(object sender, EventArgs e)
<appSettings>
<add key="DbType" value="SQLServer"/>
<add key="SQLServer" value="server=.;database=MIS;uid=sa;pwd=MIS>
<add key="Oracle" value="Data source=oratest;uid=ivan;password=ivan"/>
</appSettings>
可以发现,上述工厂类对具体类的实现,是通过判断参数来进行区别的,虽然看起来有些不雅,但通常可以解决很多的问题。随后读得抽象工厂模式,利用发射机制可能可以有效的解决这个问题。
【实践】
WMS系统中的入库作业很多的movement Type,不同的mvt在抛转ERP时要调用不同的RFC或者进行很多不同的操作。并且,实践证明,mvt的增加/减少在无休止的进行...这样,我们必须把这个抛转的动作进行抽象封装,使得这个变化点易于维护和扩展。
如图所示:根据不同的MVT,执行不同的动作
此为一个简单的应用Demo.
SourceCode:/Files/Ivan-Yan/SimpleFactoryPattern.rar
参考文章:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html
大话设计模式
相关文章推荐
- 设计模式系列一创建型模式之(简单工厂VS工厂方法)
- 【设计模式】简单工厂模式
- 设计模式-简单工厂、工厂模式(转载)
- 设计模式--简单工厂应用 java
- 设计模式之创建型模式——简单工厂(又称为静态工厂不属于GOF23种设计模式以内)
- 设计模式之简单的工厂模式
- 设计模式:工厂方法模式(C++)【简单工厂进行升级】
- Java设计模式之简单工厂、工厂方法和抽象工厂
- android设计模式之简单工厂模式
- 设计模式.简单工厂
- 简单工厂设计模式
- C#简单工厂设计模式实现计算器
- 设计模式——工厂模式(简单工厂)
- 设计模式____工厂模式(简单工厂,抽象工厂)
- 设计模式--简单工厂模式
- Unity设计模式之简单工厂模式
- 设计模式之1---简单工厂模式
- 设计模式之简单工厂
- java设计模式之工厂设计模式(简单工厂设计模式、工厂设计模式、抽象设计模式)
- 设计模式之三种工厂模式总结(简单工厂、工厂方法、抽象工厂)