0
点赞
收藏
分享

微信扫一扫

设计模式- 抽象工厂模式

辰鑫chenxin 2022-04-14 阅读 73

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();
举报

相关推荐

0 条评论