工厂模式
>>优点:1、将创建实例的工作与使用实例的工作分开
2、把初始化实例时的工作放到工厂里进行,使代码更容易维护。
3、使得修改代码时不会引起太大的变动,良好的扩展性。
>>举例:
USB接口可以用来插U盘,鼠标等。
新建一个解决方案,添加新建解决方案文件夹,添加5个类库,分别是父类USB类库,子类Mouse类库和Disk类库(命名规则,名字+Class),
当然,还有最重要的类库FactoryLib和实例。
引用:工厂要用父类和子类 所以需要引用父类和子类。主程序只需要工厂和父类,不需要引用具体的子类。子类继承父类,需要引用父类。
>>代码解释说明:
namespace USBComponentClass
{
public class USBComponent
{
public virtual void Insert()//父类方法
{
//之后需重写,暂时不做任何处理
}
}
}
namespace UMouseClass
{
public class UMouse:USBComponentClass.USBComponent//继承父类
{
public override void Insert()//重写父类方法
{
Console.WriteLine("鼠标可以使用了");
}
}
}
namespace UDiskClass
{
public class UDisk:USBComponentClass.USBComponent//继承父类
{
public override void Insert()//重写父类方法
{
Console.WriteLine("U盘可以使用了");
}
}
}
namespace FactoryLib
{
//工厂要用父类和子类 所以需要引用父类和子类
public class Factory
{
public static USBComponent CreateInstance(string type)
{
switch (type)
{
case "1": return new UDisk();//当用户输入1时,返回U盘对象的方法
case "2": return new UMouse();//当用户输入2时,返回鼠标对象的方法
default:
Console.WriteLine("出错啦!");
return null;//主程序的父类usb为null
}
}
}
}
namespace 多态的项目_实例
{
//主程序只需要工厂和父类,不需要引用具体的子类
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请问需要使用什么设备");
Console.WriteLine("1.U盘");
Console.WriteLine("2.鼠标");
string choose = Console.ReadLine();//接收用户输入值
//创建子类赋值给父类
USBComponent usb = Factory.CreateInstance(choose);//传入用户输入值
if (usb != null)//当用户输入正确数字时,执行方法
{
usb.Insert();
}
else//否则报错提示
{
Console.WriteLine("请选择正确的设备");
}
Console.ReadKey();
}
}
}
</pre><pre class="html" name="code">
>>>修改特定对象方法
桌面新建文件夹App,将主程序和config文件以及各类库的dll文件复制到App。例如,修改用户输入错误时,显示的语句,
可在源代码中添加代码,重新加载程序,将工厂的dll文件复制到桌面,替换掉app中的工厂dll文件,运行主程序,即已完成修改。