包含角色:产品接口、具体产品类、工厂接口、具体工厂类
实现开闭原则:采用“反射”+“配置文件”的技术
问题:据说清朝有个皇帝穿衣非常的奢侈,每种衣服(具体产品类)由一个宫女(具体工厂类)专门负责,这样一来,每增加一种衣服(具体产品类),就要多出一个宫女(具体工厂类),但是他们各负其责,互不影响。
特点:可以动态的创建(由宫女去拿)已存在的具体产品(衣服),如果皇帝的要求太苛刻,而这种衣服还没有,只需要增加一个宫女(具体工厂类),一种衣服(具体产品类),就能够满足他的要求了。每个宫女只负责一种衣服(单一职责),要增加一种衣服,对于以前的所有宫女与衣服来说,都不会受到影响(开闭原则)。
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>