设计模式之抽象工厂

抽象工厂模式结构图

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工程又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

产品族:一个工厂类生产出的产品属于一个产品族,视作具体工厂类生产出来的具体产品类

产品等级:不同工厂类的同一个产品等级,产品等级可以视作继承抽象工厂类的工厂类

手机、电脑两种产品,有华为和苹果两个工厂,两个工厂都可以生产手机和电脑;

1、手机和电脑两种产品,定义两个接口

2、华为和苹果都可以生产者手机和电脑,所以有4个实现类;

3、需要创建华为和苹果的工厂类,先将工厂类进行抽象,里面有创建两个产品的方法,返回的是产品的接口类

4、创建华为和苹果的工厂实现类,继承工厂类接口,实现创建各自产品的方法

5、客户端调用时,直接用工厂接口类创建需要的工厂,拿到对应的产品

csharp 复制代码
 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("----------华为工厂----------");
            IProductFactory huaweiFactory = new HuaweiFactory();//创建华为工厂
           

            //生产华为手机
            IPhoneProduct huaweiPhone = huaweiFactory.phoneProduct();
            huaweiPhone.Show();
            huaweiPhone.Open();

            //生产华为电脑
            IComputerProduct huaweicomputer = huaweiFactory.computerProduct();
            huaweicomputer.Show();
            huaweicomputer.Open();



            Console.WriteLine("----------苹果工厂----------");
            IProductFactory appleFactory = new AppleFactory();//创建苹果工厂

            //生产苹果手机
            IPhoneProduct applePhone = appleFactory.phoneProduct();
            applePhone.Show();
            applePhone.Open();

            //生产苹果电脑
            IComputerProduct applecomputer = appleFactory.computerProduct();
            applecomputer.Show();
            applecomputer.Open();


            Console.ReadLine();

        }
    }

    //手机产品接口
    public interface IPhoneProduct
    {
        public  void Open()
        {
            Console.WriteLine("开机");
        }
        public  void Close()
        {
            Console.WriteLine("关机");
        }
        public  void Show()
        {
            Console.WriteLine("我是手机");
        }
    }

    //华为手机
    public class HuaweiPhone:IPhoneProduct
    {
        public  void Open()
        {
            Console.WriteLine("华为手机开机");
        }
        public void Close()
        {
            Console.WriteLine("华为手机关机");
        }
        public void Show()
        {
            Console.WriteLine("我是华为手机");
        }

    }
    //苹果手机
    public class ApplePhone : IPhoneProduct
    {
        public void Open()
        {
            Console.WriteLine("苹果手机开机");
        }
        public void Close()
        {
            Console.WriteLine("苹果手机关机");
        }
        public void Show()
        {
            Console.WriteLine("我是苹果手机");
        }
    }


    //电脑产品接口
    public interface IComputerProduct
    {
        public void Open()
        {
            Console.WriteLine("电脑开机");
        }
        public void Close()
        {
            Console.WriteLine("电脑关机");
        }
        public void Show()
        {
            Console.WriteLine("我是电脑");
        }

    }

    //华为电脑
    public class HuaweiComputer:IComputerProduct
    {
        public void Open()
        {
            Console.WriteLine("华为电脑开机");
        }
        public void Close()
        {
            Console.WriteLine("华为电脑关机");
        }
        public void Show()
        {
            Console.WriteLine("我是华为电脑");
        }
    }
    //苹果电脑
    public class AppleComputer:IComputerProduct
    {
        public void Open()
        {
            Console.WriteLine("苹果电脑开机");
        }
        public void Close()
        {
            Console.WriteLine("苹果电脑关机");
        }
        public void Show()
        {
            Console.WriteLine("我是苹果电脑");
        }

    }


    //抽象工厂类
    public interface IProductFactory
    {
        //生产手机
        IPhoneProduct phoneProduct();

        //生产电脑
        IComputerProduct computerProduct();
    }


    //华为工厂实现类
    public class HuaweiFactory : IProductFactory
    {
        public IComputerProduct computerProduct()
        {
            return new HuaweiComputer();
        }

        public IPhoneProduct phoneProduct()
        {
            return new HuaweiPhone();
        }
    }

    //苹果工厂实现类

    public class AppleFactory : IProductFactory
    {
        public IComputerProduct computerProduct()
        {
            return new AppleComputer();
        }

        public IPhoneProduct phoneProduct()
        {
            return new ApplePhone();
        }
    }

抽象工厂模式的优缺点

优点:一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建)

缺点:

产品族扩展非常困难,要增加一个系列的某一产品,既要修改工厂抽象类里加代码,又修改具体的实现类里面加代码;

增加了系统的抽象性和理解难度

适用场景

1、一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码

2、提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

抽象工厂模式符合依赖抽象原则

创建对象实例时,不要直接new 一个对象,而是把创建对象的动作放在一个工厂的方法中

不要让类继承具体类,而是继承抽象类或者是实现接口。

不要覆盖基类中以及实现的方法

相关推荐
geovindu11 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
Carl_奕然19 小时前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
Carl_奕然19 小时前
【智能体】Loop 的四种设计模式之:Hill Climbing Loop(2026 最新版)
人工智能·python·设计模式
晚安code2 天前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
染指11102 天前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
路弥行至3 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
YYYing.3 天前
【设计模式系列 (九) 】装饰器模式
c++·后端·设计模式·装饰器模式·c/c++
沫璃染墨3 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
c萱4 天前
AI产品经理——01基础认知篇
设计模式·prompt·aigc·产品经理·ai编程·gitcode·ai-native
YYYing.4 天前
【设计模式系列 (八) 】组合模式
c++·后端·设计模式·组合模式·c/c++