包含角色:产品接口、具体产品类、工厂接口、具体工厂类
实现开闭原则:采用“反射”+“配置文件”的技术
问题:据说清朝有个皇帝穿衣非常的奢侈,每种衣服(具体产品类)由一个宫女(具体工厂类)专门负责,这样一来,每增加一种衣服(具体产品类),就要多出一个宫女(具体工厂类),但是他们各负其责,互不影响。
特点:可以动态的创建(由宫女去拿)已存在的具体产品(衣服),如果皇帝的要求太苛刻,而这种衣服还没有,只需要增加一个宫女(具体工厂类),一种衣服(具体产品类),就能够满足他的要求了。每个宫女只负责一种衣服(单一职责),要增加一种衣服,对于以前的所有宫女与衣服来说,都不会受到影响(开闭原则)。
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 Main(string[] args)
{
//客户端测试代码
try
{
IFactory factory = null;
//采用反射技术,调用具体工厂类
//利用配置文件管理类来读取系统配置文件,获得AppSettings节中key为FactoryName的value值
//即要使用哪个工厂子类来创建运算子类
string factoryName = ConfigurationManager.AppSettings["FactoryName"];
//反射技术的格式:Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
//作用:根据 "命名空间.类名称"来创建该类的实例
//由于CreateInstance("命名空间.类名称")中的参数为字符串类型,可以写成变量,
//而变量的值可从配置文件中得到
//导入反射:using System.Reflection
factory = (IFactory)Assembly.Load("Coat2").CreateInstance("Coat2." + factoryName);
ICoat coat = factory.CreateICoat();
coat.GetYourCoat();
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.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>