设计模式:(二)工厂方法

包含角色:产品接口、具体产品类、工厂接口、具体工厂类

实现开闭原则:采用“反射”+“配置文件”的技术

问题:据说清朝有个皇帝穿衣非常的奢侈,每种衣服(具体产品类)由一个宫女(具体工厂类)专门负责,这样一来,每增加一种衣服(具体产品类),就要多出一个宫女(具体工厂类),但是他们各负其责,互不影响。

特点:可以动态的创建(由宫女去拿)已存在的具体产品(衣服),如果皇帝的要求太苛刻,而这种衣服还没有,只需要增加一个宫女(具体工厂类),一种衣服(具体产品类),就能够满足他的要求了。每个宫女只负责一种衣服(单一职责),要增加一种衣服,对于以前的所有宫女与衣服来说,都不会受到影响(开闭原则)

1.产品接口

//产品接口
public interface ICoat
{void GetYourCoat);
}

2. 具体产品类

//具体产品类1
public class FashionCoat : ICoat
{public void GetYourCoat){Console.WriteLine"时尚上衣");}
}
//具体产品类2
public class BusinessCoat : ICoat
{public void GetYourCoat){Console.WriteLine"商务上衣");}
}

3. 工厂接口

//工厂接口
public interface IFactory
{ICoat CreateICoat);
}

4. 具体工厂类

//具体工厂类1
public class FashionFactory : IFactory
{public ICoat CreateICoat){return new FashionCoat);}
}
//具体工厂类2
public class BusinessFactory : IFactory
{public ICoat CreateICoat){return new BusinessCoat);}
}

5. 主方法

class Program
{static void Mainstring[] args){//客户端测试代码try{IFactory factory = null;//采用反射技术,调用具体工厂类//利用配置文件管理类来读取系统配置文件,获得AppSettings节中key为FactoryName的value值//即要使用哪个工厂子类来创建运算子类string factoryName = ConfigurationManager.AppSettings["FactoryName"];//反射技术的格式:Assembly.Load"程序集名称").CreateInstance"命名空间.类名称")//作用:根据 "命名空间.类名称"来创建该类的实例//由于CreateInstance"命名空间.类名称")中的参数为字符串类型,可以写成变量,//而变量的值可从配置文件中得到//导入反射:using System.Reflectionfactory = IFactory)Assembly.Load"Coat2").CreateInstance"Coat2." + factoryName);ICoat coat = factory.CreateICoat);coat.GetYourCoat);Console.ReadLine);}catch Exception ex){Console.WriteLineex.Message);}}
}

注:visual studio配置文件

1. 在"解决方案资源管理器"中,右键点击项目名"***"下的"引用"->"添加引用"

2. 选择“程序集”下的“框架”页面中的"System.Configuration",然后点击"确定"

3. 然后再用 using System.Configuration; 以导入"System.Configuration"这个命名空间
4. 在"解决方案资源管理器"中,右键点击项目名"***",在菜单中选择"添加"->"新建项",
5. 在弹出窗口中选择“Visual C#项”中的“应用程序配置文件”,使用默认名称“App.config”
6. 在“App.config”文件中的<configuration>  </configuration> 节点中间添加如下内容(不包含开头的//):

<appSettings><add key="FactoryName" value="AddFactory"/>
</appSettings>

 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注