【设计模式】C#实现抽象工厂方法模式

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

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、 使用场景

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
  • 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

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

相关文章
|
6月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
197 16
|
6月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
202 0
|
6月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
189 0
|
6月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
161 0
|
6月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
5月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
169 0
|
6月前
|
设计模式 Prometheus 监控
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第二十章,废话不多说直接开始~
221 0
|
10月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
219 40
|
8月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
10月前
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——工厂方法模式
简单工厂模式是一种创建型设计模式,通过一个工厂类根据传入参数创建不同类型的产品对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。适用于创建对象种类较少且调用者无需关心创建细节的场景。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。
154 15

热门文章

最新文章