抽象工厂模式介绍
抽象工厂模式不同于简单工厂模式和工厂方法模式:
简单工厂模式的缺点是:一旦工厂需要添加新的产品是,需要修改工厂类代码,这违背了“对修改关闭,对扩展开放”的原则
工厂方法模式是介于简单工厂模式和抽象工厂模式之间的一种模式,它克服了简单工厂模式的缺点,它将创建对象行工厂中剥离出来,工厂类只是一个接口或者抽象类,抽象工厂类不负责创建对象,只提供一个具体工厂必须实现的接口。
但是工厂方法模式也存在弊端,工厂方法模式中每个具体工厂类只能生产一个产品,这明显不符合实际中的开发需求。抽象工厂模式很好的解决了这个问题。
抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类
下面就以生活中 “绝味” 连锁店的例子来实现一个抽象工厂模式。例如,绝味鸭脖想在江西南昌和上海开分店,但是由于当地人的口味不一样,在南昌的所有绝味的东西会做的辣一点,而上海不喜欢吃辣的,所以上海的所有绝味的东西都不会做的像南昌的那样辣,然而这点不同导致南昌绝味工厂和上海的绝味工厂生成所有绝味的产品都不同,也就是某个具体工厂需要负责一系列产品(指的是绝味所有食物)的创建工作,下面就具体看看如何使用抽象工厂模式来实现这种情况。
抽象工厂模式UML图
抽象工厂模式的实现
YaBo.cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
abstract class YaBo
{
public abstract void Print();
}
}
NanChangYaBo .cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class NanChangYaBo : YaBo
{
public override void Print()
{
Console.WriteLine("生产了一个南昌鸭脖...");
}
}
}
ShangHaiYaBo .cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class ShangHaiYaBo : YaBo
{
public override void Print()
{
Console.WriteLine("生产了一个上海鸭脖...");
}
}
}
YaJia.cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
abstract class YaJia
{
public abstract void Print();
}
}
NanChangYaJia.cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class NanChangYaJia : YaJia
{
public override void Print()
{
Console.WriteLine("生产了一个南昌鸭架...");
}
}
}
ShangHaiYaJia .cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class ShangHaiYaJia : YaJia
{
public override void Print()
{
Console.WriteLine("生产了一个上海鸭架...");
}
}
}
YaFactory.cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
abstract class YaFactory
{
public abstract YaBo CreateYaBo();
public abstract YaJia CreateYaJia();
}
}
NanChangYaFactory .cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class NanChangYaFactory : YaFactory
{
public override YaBo CreateYaBo()
{
YaBo yb = new NanChangYaBo();
return yb;
}
public override YaJia CreateYaJia()
{
YaJia yj = new NanChangYaJia();
return yj;
}
}
}
ShangHaiYaFactory .cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class ShangHaiYaFactory : YaFactory
{
public override YaBo CreateYaBo()
{
YaBo yb = new ShangHaiYaBo();
return yb;
}
public override YaJia CreateYaJia()
{
YaJia yj = new ShangHaiYaJia();
return yj;
}
}
}
Customer.cs:
using System;
namespace DesignModelDemo.AbstractFactory
{
class Customer
{
static void Main(string[] args)
{
//客户点一只南昌的鸭脖和上海的鸭架,需要从不同的工厂生产
YaFactory nanChangYaFactory = new NanChangYaFactory();
YaBo nanChangYaBo = nanChangYaFactory.CreateYaBo();
nanChangYaBo.Print();
YaFactory shangHaiYaFactory = new ShangHaiYaFactory();
YaJia shangHaiYaJia = shangHaiYaFactory.CreateYaJia();
shangHaiYaJia.Print();
}
}
}