前言
这个相对来说有写复杂,不过多研究一会就懂了。只是千万要有耐心哦。
工厂方法模式
what
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
情景
将每个类都建立一个工厂,这样就保证扩展时不会动已经存在的类,而只需要增加工厂就可以了。遵循了开放-封闭原则
与简单工厂的区别
简单工厂模式
最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户来说,去除了与具体产品的依赖。但也存在一个问题,我想要添加分支时,需要修改原有的类,这样就等于我们不但对扩展开放了,对修改也开放了,违背了之前写过的开放-封闭原则。于是这时候工厂方法模式就出来了。
工厂方法
克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
代码展示
雷锋类:
class LeiFeng //雷锋类
{
public void Sweep()
{
Console.WriteLine("我帮老人扫地");
}
public void Wash()
{
Console.WriteLine("我帮老人洗衣");
}
public void BuyRice()
{
Console.WriteLine("我帮老人买米");
}
}
学雷锋的大学生类:
class Undergraduate : LeiFeng //学雷锋的大学生类,继承雷锋类
{ }
志愿者类:
class Volunteer:LeiFeng //社区志愿者,继承雷锋类
{
}
接口雷锋工厂类:
interface IFactory //雷锋工厂---接口
{
LeiFeng CreateLeiFeng();
}
学雷锋的大学生工厂类:
class UndergraduateFactory : IFactory //学雷锋的大学生工厂
{
public LeiFeng CreateLeiFeng()
{
return new Undergraduate();
}
}
社区志愿者工厂类:
class VolunteerFactory : IFactory //社区志愿者工厂
{
public LeiFeng CreateLeiFeng()
{
return new Volunteer();
}
}
客户端:
class Program
{
static void Main(string[] args)
{
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
Console.Read();
}
}
效果图:
后记
有耐心哦~