设计模式-工厂模式

191 阅读1分钟

设计模式中工厂模式是最基础的一个设计模式,也是使用最频繁的一种模式,废话不多说,直接上干货。

一、普通工厂

//其工厂模式中产品的基类
namespace Design.Databases {
   public abstract class BasicDb { 
        public abstract IListSearch();
   }
}
//其工厂模式中的A类产品
namespace Design.Databases { 
   public class OracleDb : BasicDb { 
        public override IListSearch() { 
            Console.WriteLine("查询Oracle数据库"); return new List();
       }
   }
}
//其工厂模式中的B类产品
namespace Design.Databases {
       public class MySqlDb : BasicDb { 
            public override IListSearch() { 
                Console.WriteLine("查询MySql数据库"); return new List();
           }
       }
}
//普通工厂
namespace Design.Factory {
   public class DbFactory {
       public static BasicDb createDb(string type) {
           switch (type) {
               case "mysql" :
                   return new MySqlDb();
               case "oracle" :
                   return new OracleDb();
               default :
                   throw new ArgumentException(string.Format("没有定义[{0}]该类型的数据库", type));
           }
       }
   }
}

这是工厂设计模式中最基础的一个例子,我们可以根据传参type来判断数据库类型,我们发现传参的方式很容易导致导参不对,创建数据库类可能会报错,不符合最少知识原则,而且维护性差,我们可以对它们进行升级改造。

二、抽象工厂

//抽象工厂
namespace Design.Factory { 
   public interface IDbFactory<T> {
         T createDb();
   }
}
//Oralce工厂具体类
namespace Design.Factory { 
    public class OralceFactory : IDbFactory<OracleDb> {
           public static OracleDb createDb() {
               return new OracleDb();
           }
       }
}
//MySql工厂具体类
namespace Design.Factory { 
    public class MySqlFactory : IDbFactory<MySqlDb> {
       public static MySqlDb createDb() {
               return new MySqlDb();
        }
   }
}

使用抽象工厂的好处就是外部只需要知道工厂接口,不需要知道工厂具体实现,当在某类中要使用指定的数据库工厂即可,如果有需求扩展其它数据库,可以继续新增一个目标工厂就行,不需要对其它的内容做修改。