设计模式(十六)之抽象工厂模式

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

QQ图片20220424163055.jpg

关于工厂模式,我们之前说过了工厂模式,简单工厂模式。


这篇日志,我们来说一下抽象工厂模式,那么,何为抽象工厂模式呢?


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


下面我们来写一个简单的小例子,之后,我们再分析抽象工厂模式的优缺点及三种工厂模式各自的特点。


以德国大众集团为例,他生产奥迪和大众汽车,其二者所使用的发动机和变速器都是截然不同的。那这样说来,实现这个例子。需要


抽象工厂类:AbstractFactory.cs 含有发动机接口与变速器接口,返回其二者各自的对象 抽象发动机类:AbstractEngine.cs 抽象变速器类:AbstractSpeed.cs 奥迪发动机类:AudiEngine.cs 大众发动机类:DasEngine.cs 奥迪变速器类:AudiSpeed.cs 大众变速器类:DasSpeed.cs 奥迪汽车类:AudiCar.cs 大众汽车类:DasCar.cs 客户端:Program.cs


抽象工厂类:AbstractFactory.cs


返回具体产品族的抽象类对象,具体产品类调用


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namesace AbstractFactory
{
    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class AbstractFactorys
    {
        /// <summary>
        /// 抽象发动机类(具体产品族)
        /// </summary>
        public abstract AbstractEngine CreateEngine();
        /// <summary>
        /// 抽象变速器类(具体产品族)
        /// </summary>
        public abstract AbstractSpeed CreateSpeed();
    }
}


抽象发动机类(产品族):AbstractEngine.cs


不同类型的发动机继承这个抽象发动机类来进行生产。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 生产发动机抽象类
    /// </summary>
    public abstract class AbstractEngine
    {
        /// <summary>
        /// 生产产品的方法
        /// </summary>
        public abstract void vardump();
    }
}


抽象变速器类(产品族):AbstractSpeed.cs


不同类型的变速器继承这个抽象变速器类来进行生产。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 生产变速器抽象类
    /// </summary>
    public abstract class AbstractSpeed
    {
        /// <summary>
        /// 生产产品的方法
        /// </summary>
        public abstract void vardump();
    }
}


奥迪发动机类(具体产品):AudiEngine.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 奥迪发动机类(具体)
    /// </summary>
    public class AudiEngine:AbstractEngine
    {
        public override void vardump()
        {
            Console.WriteLine("奥迪发动机生产完毕!");
        }
    }
}


大众发动机类(具体产品):DasEngine.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 大众发动机类(具体)
    /// </summary>
    public class DasEngine: AbstractEngine
    {
        public override void vardump()
        {
            Console.WriteLine("dazhong发动机生产完毕!");
        }
    }
}


奥迪变速器类(具体产品):AudiSpeed.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 奥迪变速器类(具体)
    /// </summary>
    public class AudiSpeed:AbstractSpeed
    {
        public override void vardump()
        {
            Console.WriteLine("奥迪变速器生产完毕!");
        }
    }
}


大众变速器类(具体产品):DasSpeed.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 大众变速器类(具体)
    /// </summary>
    public class DasSpeed:AbstractSpeed
    {
        public override void vardump()
        {
            Console.WriteLine("dazhong变速器生产完毕!");
        }
    }
}


奥迪汽车类:AudiCar.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 奥迪汽车类
    /// </summary>
    public class AudiCar: AbstractFactorys
    {
        public override AbstractEngine CreateEngine()
        {
            return new AudiEngine();
        }
        public override AbstractSpeed CreateSpeed()
        {
            return new AudiSpeed();
        }
    }
}


大众汽车类:DasCar.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 大众汽车类
    /// </summary>
    public class DasCar:AbstractFactorys
    {
        /// <summary>
        /// 发动机
        /// </summary>
        /// <returns></returns>
        public override AbstractEngine CreateEngine ()
        {
            return new DasEngine();
        }
        /// <summary>
        /// 变速箱
        /// </summary>
        /// <returns></returns>
        public override AbstractSpeed CreateSpeed()
        {
            return new DasSpeed();
        }
    }
}


客户端:Program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    /// <summary>
    /// 客户端
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            AbstractEngine engine = null;
            AbstractSpeed speed = null;
            DasCar audi = new DasCar();
            // 实例化一个奥迪发动机类
            engine =  audi.CreateEngine();
            engine.vardump();
            // 实例化一个奥迪变速器类
            speed = audi.CreateSpeed();
            speed.vardump();
            Console.WriteLine("大众汽车组装完成!");
            Console.WriteLine("---------------------------------------------------");
            AudiCar das = new AudiCar();
            engine = das.CreateEngine();
            engine.vardump();
            speed = das.CreateSpeed();
            speed.vardump();
            Console.WriteLine("奥迪汽车组装完成!");
            Console.WriteLine("---------------------------------------------------");
            Console.ReadKey();
        }
    }
}


最后具体效果如下:


QQ图片20220424163058.jpg


以上就是抽象工厂模式的小例子,下面我们说一下抽象工厂模式的优缺点;


抽象工厂模式优点:


具体产品在应用层代码隔离,无须关系创建细节 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一产品族中的对象;


抽象工厂模式缺点:


规定了所有可能被创建的产品集合,产品族扩展新的产品困难,需要修改抽象工厂的接口 增加了系统的抽象性和理解难度 增加新的产品等级结构麻烦


举个例子:增加一个轮胎产品族,我们需要增加抽象轮胎类、具体轮胎类,还需要修改抽象工厂类,相对比较麻烦


适用环境:


用户无需关心对象的创建过程,将对象的创建和使用解耦; 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构;   系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使用户能够动态改变产品族,也可以很方便的增加新的产品族;


下边对三个工厂模式做一个统一的总结:


简单工厂模式:


简单工厂模式的工厂类随着产品类的增加需要增加额外的代码


工厂方法模式:


工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性 但是在实际应用中,一个工厂不止会创建单一的产品,因为现在的工厂都多元化了,一个工厂创建一系列的产品,这就引入了抽象工厂的概念。

抽象工厂模式:



抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。


以上便是抽象工厂模式的理解。



目录
相关文章
|
5月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
29 0
|
4月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
29 5
|
9天前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
5月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
5月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
56 2
|
5月前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
172 4
|
2月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
32 1
|
2月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
2月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
2月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式