【设计模式】抽象工厂方法模式

【设计模式】抽象工厂方法模式(C#)

1、概述

是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。(同族的不同等级的产品可以理解为Apple公司的iPhone、iPad、Mac,这里建议大家搜索产品等级和产品族。)

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

2、抽象工厂方法模式实现思路

现披萨店业务发生改变,不仅要生产披萨还要生产牛排,如希腊牛排、奶酪牛排(费城)等,要是按照工厂方法模式,需要定义牛排类、希腊牛排类、奶酪牛排类、希腊牛排工厂、奶酪牛排工厂、牛排工厂类,很容易发生类爆炸情况。其中希腊披萨、奶酪披萨是一个产品等级,都是披萨;希腊牛排、奶酪牛排也是一个产品等级;希腊披萨和希腊牛排是同一产品族,奶酪披萨和奶酪牛排是同一产品族。所以这个案例可以使用抽象工厂模式实现。

首先,我们先创建一个简单的类。

//抽象产品类
public abstract class Pizza
    {
        //名字
        public string Name;

        //准备原材料
        public abstract void Prepare();

        public void Bake()
        {
            Console.WriteLine($"{this.Name} bake");
        }

        public void Cut()
        {
            Console.WriteLine($"{this.Name} cut");
        }

        public void Box()
        {
            Console.WriteLine($"{this.Name} box");
        }

    }

//具体产品类
public class GreekPizza : Pizza
    {
        public override void Prepare()
        {
            Console.WriteLine("GreekPizza 准备原材料");
        }
    }

//具体产品类
public class CheessPizza : Pizza
    {
        public override void Prepare()
        {
            Console.WriteLine("CheessPizza 准备原材料");
        }
    }

//抽象产品类
public abstract class Steak
    {
        //名字
        public string Name;

        //准备原材料
        public abstract void Prepare();

        public void Bake()
        {
            Console.WriteLine($"{this.Name} bake");
        }

        public void Cut()
        {
            Console.WriteLine($"{this.Name} cut");
        }

        public void Box()
        {
            Console.WriteLine($"{this.Name} box");
        }
    }

//具体产品类
public class CheessSteak : Steak
    {
        public override void Prepare()
        {
            Console.WriteLine("CheessSteak 准备原材料");
        }
    }

//具体产品类
 public class GreekSteak : Steak
    {
        public override void Prepare()
        {
            Console.WriteLine("GreekSteak 准备原材料");
        }
    }

//抽象工厂类
public abstract class PizzaFactory
    {
       public abstract Pizza CreatePizza();
    }

//具体工厂类
public abstract class WesternStyleFoodFactory
    {
        public abstract Pizza CreatePizza();

        public abstract Steak CreateSteak();
    }

//具体工厂类
public class GreekFactory:WesternStyleFoodFactory
    {
        public override Pizza CreatePizza()
        {
            GreekPizza greekPizza = new GreekPizza();
            greekPizza.Name = "希腊披萨";
            greekPizza.Prepare();
            greekPizza.Bake();
            greekPizza.Cut();
            greekPizza.Box();
            return greekPizza;
        }

        public override Steak CreateSteak()
        {
            GreekSteak greekSteak = new GreekSteak();
            greekSteak.Name = "希腊牛排";
            greekSteak.Prepare();
            greekSteak.Bake();
            greekSteak.Cut();
            greekSteak.Box();
            return greekSteak;
        }
    }

//具体工厂类
public class CheessFactory : WesternStyleFoodFactory
    {
        public override Pizza CreatePizza()
        {
            CheessPizza cheessPizza = new CheessPizza();
            cheessPizza.Name = "奶酪披萨";
            cheessPizza.Prepare();
            cheessPizza.Bake();
            cheessPizza.Cut();
            cheessPizza.Box();
            return cheessPizza;
        }

        public override Steak CreateSteak()
        {
            CheessSteak cheessSteak = new CheessSteak();
            cheessSteak.Name = "奶酪牛排";
            cheessSteak.Prepare();
            cheessSteak.Bake();
            cheessSteak.Cut();
            cheessSteak.Box();
            return cheessSteak;
        }
    }

//订购披萨
   public class PizzaStore
    {
        WesternStyleFoodFactory _factory;
        public void setFactory(WesternStyleFoodFactory factory)
        {
            this._factory = factory;
        }
        public Pizza OrderPizza()
        {
            Pizza pizza = _factory.CreatePizza();
            return pizza;
        }

        public Steak OrderSteak()
        {
            Steak steak = _factory.CreateSteak();
            return steak;
        }
    }

//使用工厂方法模式
class Program
    {
        static void Main(string[] args)
        {
            PizzaStore pizzaStore = new PizzaStore();
            WesternStyleFoodFactory greekPizzaFactory = new GreekFactory();
            pizzaStore.setFactory(greekPizzaFactory);
            pizzaStore.OrderPizza();
            pizzaStore.OrderSteak();

            WesternStyleFoodFactory cheessPizzaFactory = new CheessFactory();
            pizzaStore.setFactory(cheessPizzaFactory);
            pizzaStore.OrderPizza();
            pizzaStore.OrderSteak();
        }
    }

******************【运行结果】******************
GreekPizza 准备原材料
希腊披萨 bake
希腊披萨 cut
希腊披萨 box
GreekSteak 准备原材料
希腊牛排 bake
希腊牛排 cut
希腊牛排 box
CheessPizza 准备原材料
奶酪披萨 bake
奶酪披萨 cut
奶酪披萨 box
CheessSteak 准备原材料
奶酪牛排 bake
奶酪牛排 cut
奶酪牛排 box

如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类。

3、 优缺点

优点:

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

  • 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
4、 使用场景
  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。

  • 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。

  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

如:输入法换皮肤,一整套一起换。生成不同操作系统的程序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会敲键盘的肘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值