简单工厂模式结构图
工厂方法模式结构图
雷锋工厂
比如有大学生和社区资源者以雷锋的名义去帮助老人做事情。
雷锋类:
namespace ConsoleApp1
{
/// <summary>
/// 雷锋类,定义工厂方法所创建的对象的接口
/// </summary>
class LeiFeng
{
public void Sweep() {
Console.WriteLine("扫地");
}
public void Wash() {
Console.WriteLine("洗衣");
}
public void BuyRice() {
Console.WriteLine("买米");
}
}
}
学雷锋做事的大学生:
namespace ConsoleApp1
{
/// <summary>
/// 学雷锋的大学生
/// </summary>
class Undergraduate:LeiFeng
{
}
}
学雷锋做事的社区自愿者:
namespace ConsoleApp1
{
/// <summary>
/// 学雷锋的社区志愿者
/// </summary>
class Volunteer :LeiFeng
{
}
}
简单工厂类:
namespace ConsoleApp1
{
/// <summary>
/// 简单雷锋工厂类
/// </summary>
class SimpleFactory
{
public static LeiFeng CreateLeiFeng(string type) {
LeiFeng result = null;
switch (type) {
case "学雷锋的大学生":
result = new Undergraduate();
break;
case "社区志愿者":
result = new Volunteer();
break;
}
return result;
}
}
}
客户端代码:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//简单工厂模式,这里有三句重复的代码
LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentA.BuyRice();
LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentB.Sweep();
LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
studentC.Wash();
}
}
}
再用工厂方法模式写一遍,创建雷锋工厂:
namespace ConsoleApp1
{
//雷锋工厂,声明工厂方法,该方法返回一个雷锋类型的对象
interface IFactory
{
LeiFeng CreateLeiFeng();
}
}
namespace ConsoleApp1
{
//学雷锋的大学生工厂
class UndergraduateFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Undergraduate();
}
}
}
namespace ConsoleApp1
{
//学雷锋的社区志愿者工厂
class VolunteerFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Volunteer();
}
}
}
客户端调用:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//工厂方法模式
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
Console.ReadLine();
}
}
}
何时用简单工厂?何时用工厂方法?
工厂方法是简单工厂的进一步抽象和推广。工厂方法克服了简单工厂违背开放——封闭原则的缺点,即如果还要添加一个学雷锋的xx对象工厂,就要在工厂类的方法里加"Case"的分支条件,修改原有的类?这就等于说,不但对扩展开放了,对修改也开放了。 但缺点就是由于每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。