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                                    
示例代码补充图

                                                                                                                               

posted @ 2012-11-30 22:26  missmore  阅读(209)  评论(0)    收藏  举报