前言;工厂方法模式又叫做工厂模式,它是23个设计模式中的一个,它解决的还是在软件设计中创建对象的问题,它可以更好的解决用户需求的变化.
问题;在简单工厂模式中,我们将实例化的对象全部放于Factory.cs(工厂类),在我们的预知下我们可以实例化对象,但是我们的预知是有限的,而客户的需求是无限的,这样就出现了问题,一但客户的需求过于复杂,我们就要修改源码了,这是设计模式不允许的.
定义:在工厂模式中,父类负责定义创建对象的接口,子类负责new具体对象。
现实中的例子:我们举一个例子,这个例子和简单工厂的例子有些不同。
据说清朝有个皇帝,它非常奢侈,每个衣服都有一个宫女负责,这样一来,每增加一种衣服,就得多出一个宫女,但她们各付其职,互不影响。
分析:实现的功能,可以根据皇帝的需求,创建宫女去拿所对应的衣服,如果皇帝太奢侈,这种衣服还没有,只需要添加一个宫女就可以满足他的需求了,每个宫女只要有一种衣服即可(高内聚),要增加衣服,对于原来宫女和衣服来说,谁都不影响谁。
商品系列
商品接口ICoat.cs
public interface ICoat { void ShowCoat();
}
具体商品:商务上衣
public class BusinessCoat : ICoat { public void ShowCoat() { Console.Write("这件是商务上衣"); //throw new NotImplementedException(); } }
具体商品:时尚上衣
public class BusinessFactory : IFactory { public ICoat CreateCoat() { return new BusinessCoat(); ///throw new NotImplementedException(); } }
下面是工厂系列
总厂房:
public interface IFactory { ICoat CreateCoat(); }
时尚上衣工厂
public class FashionFactory : IFactory { public ICoat CreateCoat() { return new FashionCoat(); } }
商务上衣工厂
public class BusinessFactory : IFactory { public ICoat CreateCoat() { return new BusinessCoat(); ///throw new NotImplementedException(); } }
皇帝:
static void Main(string[] args) { BusinessCoat coat = new BusinessCoat(); coat.ShowCoat(); Console.ReadLine(); }
架构图:
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的!
缺点:添加一个产品就要添加一个工厂类,这使程序的架构非常负责,从而使系统阅读起开非常困难。