文章目录
前言
使用C#面向对象的抽象、继承、接口等方法实现面向对象设计模式中的抽象工厂模式。
一、功能说明
以周黑鸭为例:
1.“周黑鸭”品牌旗下有两个王牌产品“鸭脖”和“鸭架”。“周黑鸭”想在长沙和上海开分店,但是由于当地人的口味不一样,在长沙的所有产品会做的辣一点,而上海不喜欢吃辣的,所以上海的产品都不会做的像长沙的那样辣,也就是某个具体工厂需要负责一系列产品(指的是“周黑鸭”品牌所有食物)的创建工作,请使用抽象工厂模式来实现这种情况;
2.现在“周黑鸭”品牌针对武汉市场推出新产品“鸭舌”,请在之前的模式下添加武汉工厂与“鸭舌”产品;
二、设计流程+关键源码展示
1.抽象工厂设计模式原理结构:
2.抽象工厂类
提供创建两个不同地方的鸭架和鸭脖以及新增武汉鸭舌的接口
public abstract class AbstractFactory1
{
//周黑鸭中鸭脖和鸭架的创建接口
public abstract YaBo CreateYaBo();
public abstract YaJia CreateYaJia();
}
public abstract class AbstractFactory2
{
//新增鸭舌的创建接口
public abstract YaShe CreateYaShe();
}
3.长沙工厂
public class ChangshaFactory : AbstractFactory1
{
// 制作长沙鸭脖
public override YaBo CreateYaBo()
{
return new ChangshaYaBo();
}
// 制作长沙鸭架
public override YaJia CreateYaJia()
{
return new ChangshaYaJia();
}
}
4.上海工厂
public class ShangHaiFactory : AbstractFactory1
{
// 制作上海鸭脖
public override YaBo CreateYaBo()
{
return new ShangHaiYaBo();
}
// 制作上海鸭架
public override YaJia CreateYaJia()
{
return new ShangHaiYaJia();
}
}
5.新增武汉工厂
public class WuHanFactory : AbstractFactory2
{
//制作武汉鸭舌
public override YaShe CreateYaShe()
{
return new WuHanYaShe();
}
}
6.各产品的抽象类
/// <summary>
/// 鸭脖抽象类,供每个地方的鸭脖类继承
/// </summary>
public abstract class YaBo
{
/// <summary>
/// 打印方法,用于输出信息
/// </summary>
public abstract void Print();
}
/// <summary>
/// 鸭架抽象类,供每个地方的鸭架类继承
/// </summary>
public abstract class YaJia
{
/// <summary>
/// 打印方法,用于输出信息
/// </summary>
public abstract void Print();
}
/// <summary>
/// 鸭舌抽象类,供武汉的鸭舌类继承
/// </summary>
public abstract class YaShe
{
/// <summary>
/// 打印方法,用于输出信息
/// </summary>
public abstract void Print();
}
7.各产品的类
/// <summary>
/// 长沙的鸭脖类,因为湖南人喜欢吃辣的,所以长沙的鸭脖稍微会比上海做的辣
/// </summary>
public class ChangshaYaBo : YaBo
{
public override void Print()
{
Console.WriteLine("长沙的鸭脖");
}
}
/// <summary>
/// 上海的鸭脖没有长沙的鸭脖做的辣
/// </summary>
public class ShangHaiYaBo : YaBo
{
public override void Print()
{
Console.WriteLine("上海的鸭脖");
}
}
/// <summary>
/// 长沙的鸭架
/// </summary>
public class ChangshaYaJia : YaJia
{
public override void Print()
{
Console.WriteLine("长沙的鸭架");
}
}
/// <summary>
/// 上海的鸭架
/// </summary>
public class ShangHaiYaJia : YaJia
{
public override void Print()
{
Console.WriteLine("上海的鸭架");
}
}
/// <summary>
/// 武汉的鸭舌
/// </summary>
public class WuHanYaShe:YaShe
{
public override void Print()
{
Console.WriteLine("武汉的鸭舌");
}
}
8.主函数
class Client
{
static void Main(string[] args)
{
// 长沙工厂制作长沙的鸭脖和鸭架
AbstractFactory1 ChangshaFactory = new ChangshaFactory();
YaBo ChangshaYabo = ChangshaFactory.CreateYaBo();
ChangshaYabo.Print();
YaJia ChangshaYajia = ChangshaFactory.CreateYaJia();
ChangshaYajia.Print();
// 上海工厂制作上海的鸭脖和鸭架
AbstractFactory1 shangHaiFactory = new ShangHaiFactory();
shangHaiFactory.CreateYaBo().Print();
shangHaiFactory.CreateYaJia().Print();
// 武汉工厂制作武汉的鸭舌
AbstractFactory2 WuHanFactory= new WuHanFactory();
YaShe WuHanYaShe = WuHanFactory.CreateYaShe();
WuHanFactory.CreateYaShe().Print();
Console.Read();
}
}
三、结果测试
四、总结
此次实验展示了抽象工厂模式的优点:
1.隔离了具体类的实现,使得客户不需要知道具体创建了什么;
2.当产品中的多个对象被设计在一起时,能保证客户始终只使用同一个组合中的对象;
3.新增工厂和产品很方便,无需修改原有代码。