C# 抽象工厂模式实例——“周黑鸭”


前言

使用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.新增工厂和产品很方便,无需修改原有代码。

五、源码

gitee
参考博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值