C#设计模式之抽象工厂(AbstractFactory) | |
这里我暂时还想不出有什么好处 我觉得就是利用接口来实现封装其子类,让具体的工作交给它的子类去做。所以说这应该不能算抽象工厂的优点,只能算作接口的优点。 2. 在C#中怎样用抽象工厂? 好,我们来看一下怎么来实现 比如说我们要写一个连接数据库的组件,既支持sqlserver的,又要支持oledb的,这时我们就可以用AbstractFactory设计模式了。 先定义一个接口: public interface IDbHelper { void ExecuteNonQuery(); DataSet ExecuteForDataSet(string sql); } 然后定义两个类(一个是sqlserver的,一个是oledb的)来继承IdbHelper这个接口: internal class SqlDbHelper:IDbHelper { public SqlDbHelper() { } public void ExecuteNonQuery() { } public DataSet ExecuteForDataSet(string sql) { //这里实现sqlserver的方法 return null; } } internal class OleDbHelper:IDbHelper { public OleDbHelper() { } public void ExecuteNonQuery() { } public DataSet ExecuteForDataSet(string sql) { //这里实现oledb的方法 return null; } } 然后,来定义一个工厂类: public class DbHelperFactory { public static IDbHelper CreateDbHelper(int DbType) { switch(DbType) { case 1: return new SqlDbHelper(); case 2: return new OleDbHelper(); default: return null; } } } 最后我们来调用这个工厂类: public class AbstractFactoryTest { public void TestMethod() { IDbHelper sqldb=DbHelperFactory.CreateDbHelper(1); sqldb.ExecuteNonQuery(); } } 这个时候我们就可以很方便的调用数据库组件了,在调用CreateDbHelper方法时,传入参数为1,那么就是调用SqlDbHelper这个类,传入参数为2,那么就是调用OleDbHelper这个类。当然传入的参数你还可以把它变为枚举型,这样就更加方便了。 这样的写法也更利于扩展,比如说以后要添加一个OracleDbHelper时,你只需要再添加一个类,改动一个方法(CreateDbHelper)就可以了。 |