工厂模式与简单工厂模式非常相似。
可以看出简单工厂模式,如果有添加一个新的实体类,那么就需要去修改工厂类中的方法,增加一个对应的语句来输出对应的对象。这样就违背了开放封闭的原则。
工厂模式就是为了解决这个问题。
抽象一个工厂接口,对应的一种实体类那么就有对应的一个实体工厂。通过这样的方式,那么就避免了去修改原有的代码。
假设有一家工厂可以生产奔驰车和奥迪车,那么我们看看类图
先看看类图
很容易看出其中的关系,如果现在要增加一个BMW,那么只需要增加一个BMW的实体类以及BMWFactory就可以了。
这样实现了对扩展的开放已经对于修改的封闭
interface IFactory { ICar CreateCar(); } class BenzFactory:IFactory { #region IFactory 成员 public ICar CreateCar() { return new Benz(); } #endregion } class AudiFactory :IFactory { #region IFactory 成员 public ICar CreateCar() { return new Audi(); } #endregion }
interface ICar { void Run(); } class Audi:ICar { #region ICar 成员 public void Run() { Console.WriteLine("Audi Run"); } #endregion } class Benz:ICar { #region ICar 成员 public void Run() { Console.WriteLine("Benz Run"); } #endregion }
internal class Program { private static void Main(string[] args) { //读取配置信息 var factoryName = ConfigurationManager.AppSettings["factoryName"]; //通过反射生成对象 var factory = (IFactory)Assembly.Load("FactoryPattern").CreateInstance("FactoryPattern." + factoryName); //运行方法 if (factory != null) factory.CreateCar().Run(); //查看结果 Console.ReadLine(); } }
这里运行的时候做了一个小小的把戏,通过读取配置文件的信息再通过反射的机制在运行时生成对象获取结果。
这样只需要改变配置就好了。