简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
使用场景:
- 工厂类负责创建的对象比较少;
- 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
- 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
优点:
工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
通过简单工厂类,对外部来说,仅仅需要知道传入什么参数就能返回何种对象就可以了。不必再理会到对象是怎样生成的,逻辑是如何实现等等。
缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求。这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
简单工厂模式解决的是对象创建的问题,它的功能是根据传入的不同参数,创建不同的对象。
基于简单工厂模式的简单示例:
namespace 简单工厂 { public class Program { static void Main(string[] args) { DataBase DB = SimpleFactory.GetInstance("Oracle"); Console.WriteLine(DB.SelectTopOne()); DataBase DB2 = SimpleFactory.GetInstance("SQLServer"); Console.WriteLine(DB2.SelectTopOne()); Console.ReadKey(); } } //简单工厂类,判断类,用于返回对应的的对象 public class SimpleFactory { public static DataBase GetInstance(string type) { DataBase db = null; switch (type) { default: case "SQLServer": db = new SQLServer(); break; case "Oracle": db = new Oracle(); break; } return db; } } //基类 public class DataBase { public virtual string SelectTopOne() { return "SELECT TOP 1 * FROM Table"; } } //实现类1 public class SQLServer : DataBase { public override string SelectTopOne() { return "SELECT TOP 1 * FROM Table"; } } //实现类2 public class Oracle : DataBase { public override string SelectTopOne() { return "SELECT * FROM Table WHERE ROWRUM <= 1"; } } }
输出如下:
类图如下: