当前位置:   article > 正文

设计模式- 抽象工厂模式

设计模式- 抽象工厂模式

N+1

假设目前你的程序里面有三个对象IphoneX、IphoneXs、IphoneXR的尺寸,那么你使用工厂模式就已经足够了,因为她们属于同一个品类,都属于苹果,如果在添加一个IPhone2022产品,也只需要把IPhone2022加入到你的苹果工厂里面就够了。
但是如果你程序里面还需要知道华为mate10或者小米8的尺寸。这时候你怎么来创建这些对象呢?这时候工厂模式明显已经不适用了,因为工厂模式是对象都实现了同一个接口,这时候就可以使用抽象工厂模式了。

抽象工工厂模式和工厂模式的区别:

抽象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
工厂方法模式的定义:为某个对象提供一个接口,而且无需指定它们的具体类。

都是子类实现接口的方法,并在子类写具体的代码。
工厂方法模式中也是可以有多个具体工厂,也是可以有多个抽象产品,和多个具体工厂、具体产品类。

是在抽象工厂接口类中,能创建几个产品对象。
抽象工厂模式的工厂能创建多个相关的产品对象,而工厂方法模式的工厂只创建一个产品对象。

什么是抽象工厂模式?

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

结构图

在这里插入图片描述

应用场景

当创建的对象是一系列相互关联或相互依赖的产品族时,如华为手机、华为平板、华为电脑
系统中有多个产品族,但每次只使用其中一族的产品,如李宁、耐克、阿迪,但有些人只穿李宁牌子的服装和鞋子
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构,如输入法皮肤 要换就整套换

优缺点

难以支持新种类的产品
抽象方法模式的最大缺点就是产品族本身的扩展非常困难。如果在产品族中增加一个新的产品类型,则需要修改多个接口,并影响现已有的工厂类。

代码

抽象类

 //抽象产品:咖啡类
    public abstract class Coffee
    {
       public  abstract void show();
    }
    //抽象产品:甜品类
    public abstract class Dessert
    {
        public abstract void show();
    }

具体类

   //具体产品:美式咖啡
    public class AmericanCoffee  : Coffee
    { 
     public override   void show()
        {Console.WriteLine("美式咖啡"); }
    }
    //具体产品:拿铁咖啡
    public class LatteCoffee : Coffee
    {
        public override void show()
        { Console.WriteLine("拿铁咖啡"); }
    }
    //具体产品:提拉米苏
    public class Trimisu : Dessert
    {
        public override void show()
        { Console.WriteLine("提拉米苏"); }
    }
    //具体产品:抹茶慕斯
    public class MatchMousse : Dessert
    {
        public override void show()
        { Console.WriteLine("抹茶慕斯"); }
    }

接口

public interface IFactory
{
    Coffee createCoffee();//生产咖啡
    Dessert createDessert();//擅长甜品
}

两个饭店

  //美式风味工厂 生产美式咖啡和抹茶慕斯
    class AmericanFlavorFactory : IFactory
    {
    public Coffee createCoffee()
    {
        return new AmericanCoffee();
    }

    public Dessert createDessert()
    {
        return new MatchMousse();
    }
}
    //意大利风味工厂 生产拿铁咖啡和提拉米苏
    class ItalyFlavorFactory  : IFactory
    {
        public Coffee createCoffee() 
    {
        return new LatteCoffee();
    }

    public Dessert createDessert()
    {
        return new Trimisu();
    }
 }

客户端

 AmericanFlavorFactory factory = new AmericanFlavorFactory(); //小张喜欢美式美味的食物                                                             
                Coffee coffee = factory.createCoffee();
                Dessert dessert = factory.createDessert();
                coffee.show();
                dessert.show();

总结:

当然,我可以为你详细解释抽象工厂模式,包括其概念、结构、优缺点以及适用场景。

  1. 概念:
    抽象工厂模式是一种创建型设计模式,它提供了一种接口,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。抽象工厂模式允许客户端代码通过一个公共接口来创建不同产品族的对象,从而隐藏了对象的创建细节。

  2. 结构:
    抽象工厂模式包含以下几个主要组件:

AbstractFactory(抽象工厂): 声明了一组创建不同产品族的方法。每个方法对应一个产品族的创建过程。

ConcreteFactory(具体工厂): 实现抽象工厂接口,负责创建特定的产品族对象。

AbstractProduct(抽象产品): 声明了产品的共同接口。

ConcreteProduct(具体产品): 实现抽象产品接口,具体工厂通过这些产品来创建对象。

  1. 优缺点:
    抽象工厂模式的优点在于:

隐藏对象创建细节: 客户端代码只需要使用抽象工厂接口和抽象产品接口,无需了解具体的类和实现细节。

保持一致性: 抽象工厂确保创建的产品是一致的,因为每个具体工厂只能创建特定的产品族。

易于扩展: 可以通过添加新的具体工厂和产品来扩展系统,无需修改已有代码。

符合开闭原则: 增加新的产品族只需要添加新的具体工厂和产品类,而不会影响已有代码。

抽象工厂模式的缺点在于:

增加类的数量: 需要定义多个抽象工厂、具体工厂和产品类,可能会增加系统的复杂性。

难以支持新种类的产品: 如果需要支持新的产品种类,除了添加新的具体工厂和产品类外,还需要修改抽象工厂接口,可能会影响到现有的具体工厂。

  1. 适用场景:
    抽象工厂模式适用于以下情况:

需要创建一系列相关或相互依赖的产品,这些产品一起构成了一个产品族。
希望提供一种统一的接口来创建不同产品族的对象,使得客户端代码与具体产品的创建过程解耦。
需要保持一致性,确保创建的产品是一致的,例如不同操作系统下的界面组件。
5. 示例:
假设你正在开发一个图形界面库,需要支持不同操作系统下的界面组件。你可以使用抽象工厂模式,创建不同操作系统下的工厂(如WindowsFactory、MacFactory),每个工厂负责创建该操作系统下的一系列界面组件(如按钮、文本框、窗口等)。

综上所述,抽象工厂模式通过提供一组接口来创建不同产品族的对象,隐藏了对象创建的细节,保持了一致性,适用于需要创建一系列相关产品的场景,以及需要保持接口一致性的系统。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1022056
推荐阅读
相关标签
  

闽ICP备14008679号