【工厂方法模式】雷锋在人间
简单工厂模式
一个简单地加减乘除类
结构图:
只要输入运算符号,工厂就可以实例化出一个合适的对象,通过多态,返回父类的方式实现了计算器的结果。
如果需要更改加法运算,直接更改OperationAdd就可以。
如果增加其他运算,只要增加相应的运算子类就可以了。
如果需要修改运算类工厂,只需要在switch中增加分支。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式
工厂方法模式:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
结构图
对于上面的加减乘除的工厂方法
工厂类与分支耦合,根据依赖倒转原则,把工厂抽象出一个接口,这个接口只有一个方法,那就是创建抽象产品的工厂方法,然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,就变成了一个工厂抽象接口和多个具体生成对象的工厂,这样在增加“求M数的N次方”的功能时,不需要更改原有的工厂类,只需要增加此功能的运算类和相应的工厂类就可以了。这样比较符合开闭原则
加减乘除的类图:
存在的问题:
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,现在是修改客户端的。
雷锋工厂
帮助孤寡老人的类叫雷锋类,雷锋需要做的是扫地 洗衣 买米等活动。雷锋可以是大学生也可以是社区志愿者,但是老人只知道“雷锋”,所以这里就让大学生和社区志愿者继承雷锋类,来帮助孤寡老人。
雷锋类
namespace 雷锋工厂
{
//雷锋
/// <summary>
/// 雷锋类拥有的方法
/// </summary>
class LeiFeng
{
public void Sweep()
{
Console.WriteLine("扫地");
}
public void Wash()
{
Console.WriteLine("洗衣");
}
public void BuyRice()
{
Console.WriteLine("买米");
}
}
}
雷锋工厂的接口;
//定义一个雷锋工厂的接口
//雷锋工厂
interface IFactory
{
LeiFeng CreateLeiFeng();
}
学雷锋的大学生工厂
//学雷锋的大学生工厂
/// <summary>
/// 继承雷锋工厂的方法
/// </summary>
class UndergraduateFactory:IFactory
{
public LeiFeng CreateLeiFeng ()
{
return new Undergraduate();
}
}
社区志愿者工厂:
//社区志愿者工厂
class VolunteerFactory:IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Volunteer();
}
}
客户端代码:
namespace 雷锋工厂
{
class Program
{
//工厂方法模式,直接调用就可以
static void Main(string[] args)
{
//这里是大学生工厂
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
//这里是社区志愿者
IFactory factory = new VolunteerFactory();
LeiFeng Volunteer = factory.CreateLeiFeng();
Volunteer.BuyRice();
Volunteer.Sweep();
Volunteer.Wash();
Console.ReadKey();
}
}
}
对比两个模式
工厂方法克服了简单工厂违背开闭原则的缺点,保持了封装对象创建过程的优点。他们都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了他的优点,但是缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。而且这里还是修改了客户端的代码。
文章来源: blog.csdn.net,作者:张艳伟_Laura,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Laura__zhang/article/details/113765845
- 点赞
- 收藏
- 关注作者
评论(0)