设计模式中工厂模式是最基础的一个设计模式,也是使用最频繁的一种模式,废话不多说,直接上干货。
一、普通工厂
//其工厂模式中产品的基类
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();
}
}
}
使用抽象工厂的好处就是外部只需要知道工厂接口,不需要知道工厂具体实现,当在某类中要使用指定的数据库工厂即可,如果有需求扩展其它数据库,可以继续新增一个目标工厂就行,不需要对其它的内容做修改。