AbstractFactory
工厂方法模式(Factory Method) 很容易和 抽象工厂模式(Abstract Factory)混淆,也是为什么接触者两者的刚开始花了近一个星期的时间去编写,整理,修改示例代码 示例写多了,看多了,渐渐二者就很容易区分了,个人感觉abstract factory是稍微简单一些的,因为构造出的实例很少需要逻辑,或者是没有逻辑上的概念,所以就先从简单的abstract factory谈起 结构:

适用性:
在以下情况可以考虑使用抽象工厂模式:
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 需要强调一系列相关的产品对象的设计以便进行联合使用时。
- 提供一个产品类库,而只想显示它们的接口而不是实现时。
来自 <http://zh.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82>
想理解 抽象工厂模式 最好脑海中先理解一个概念,产品,产品族的概念,因为 抽象工厂模式 着重解决的是产品族的增加,而不是产品的增加

由UML图和ProductFamily图就可以很容易的分析出,如果要增加一个产品族,比如增加一个linux系统下的视窗风格,要做的就是增加一个相应 的concretefactory,然后再写出具体的product即可
代码示例: 1
在不同的sqlhelper创建过程中可以很好体现这一点,这个示例是一个简化了的 抽象工厂,因为其产品只有一个--sqlhelper
抽象的SqlHelper有多个执行方法,子类MsSqlHelper和MySqlHelper拥有其override的方法
同时抽象的SqlFactory具有两个子类MsSqlFactory和MySqlFactory,二者通过abstract factory方法放回相应的sqlhelper实例
在app初始化时应该实例化一个具体的factory,然后传递factory给其聚合的某一个类,让这个类通过给定的factory来负责sqlhelper创建工作,app只需控制factory的类型就能达到改变整个程序所使用的数据库的目的 如果app想完全和factory分离,可以在二者之间建立一个管理类型的类,比如叫SqlTypeManager,他负责来确定factory的类型,而app只需要从manager手中拿到sqlhelper就行了,具体是如何拿的,拿的是什么,app都不需要关心,完全实现了松耦合 java code
1 public class App { 2 3 private static SqlHelper _sqlhelper = SqlTypeManager.sqlhelper; 4 public static void main(String[] args) 5 { 6 _sqlhelper.set_connectionstring("ConnectionString"); 7 _sqlhelper.set_sql("query"); 8 System.out.println(_sqlhelper.ExecuteNonQuery()); 9 System.out.println(_sqlhelper.GetSqlType()); 10 } 11 }
------------------------------------------------------------------------
public class SqlTypeManager { public static SqlHelper sqlhelper = new MsSqlFactory().CreateSqlHelper(); }
------------------------------------------------------------------------
1 import java.sql.*; 2 public abstract class SqlHelper { 3 private String _connectionstring; 4 public void set_connectionstring(String connectionstring) { 5 this._connectionstring = connectionstring; 6 } 7 8 private String _sql; 9 public void set_sql(String sql) { 10 this._sql = sql; 11 } 12 13 public abstract int ExecuteNonQuery(); 14 public abstract int ExecuteNonQuery(String[] paras); 15 public abstract ResultSet ExecuteQuery(); 16 public abstract ResultSet ExecuteQuery(String[] paras); 17 public abstract String GetSqlType(); 18 //...... 19 }
------------------------------------------------------------------------
public abstract class SqlFactory { public abstract SqlHelper CreateSqlHelper(); }
------------------------------------------------------------------------
import java.sql.ResultSet; public class MySqlFactory extends SqlFactory { public SqlHelper CreateSqlHelper() { return new MySqlHelper(); } } class MySqlHelper extends SqlHelper { public int ExecuteNonQuery() { //... return 0; } public int ExecuteNonQuery(String[] paras) { //... return 0; } public ResultSet ExecuteQuery() { //... return null; } public ResultSet ExecuteQuery(String[] paras) { //... return null; } public String GetSqlType() { return "MySql"; } }
------------------------------------------------------------------------
import java.sql.ResultSet; public class MsSqlFactory extends SqlFactory { public SqlHelper CreateSqlHelper() { return new MsSqlHelper(); } } class MsSqlHelper extends SqlHelper { public int ExecuteNonQuery() { //... return 0; } public int ExecuteNonQuery(String[] paras) { //... return 0; } public ResultSet ExecuteQuery() { //... return null; } public ResultSet ExecuteQuery(String[] paras) { //... return null; } public String GetSqlType() { return "Microsoft SqlServer"; } }
------------------------------------------------------------------------ ------------------------------------------------------------------------ c#code因为已经实现了,并且开始在用,代码很长,贴上来太不方便了 索性把工程文件打包了,放在了迅雷快传 http://kuai.xunlei.com/d/OLOAMZZXVOEE
示例代码补充图


浙公网安备 33010602011771号