设计模式之抽象工厂

抽象工厂模式结构图

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

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

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

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

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

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

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 一个对象,而是把创建对象的动作放在一个工厂的方法中

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

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

相关推荐
烬羽2 小时前
从 nest new 到 Hello World:一个最小 NestJS 项目,讲透工厂 + 装饰器 + 模块化
设计模式·node.js·nestjs
艺艺生辉1 天前
从if-else到策略模式
后端·设计模式
小林ixn1 天前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
workflower1 天前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-16-装饰器模式(业务实战篇)
java·设计模式·装饰器模式·功能扩展·动态增强
workflower2 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76892 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
略略略咯咯3 天前
(总结)设计模式
设计模式