设计模式之抽象工厂模式(Abstract Factory)

一、抽象工厂模式(Abstract Factory)简介

抽象工厂模式(Abstract Factory)是以一个超级工厂创建其他工厂。它属于创建型模式。抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。

二、抽象工厂模式(Abstract Factory)的优点

抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展

三、抽象工厂模式(Abstract Factory)的缺点

抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这就违背了"开闭原则"。

四、抽象工厂模式(Abstract Factory)适用场景

使用抽象工厂模式的系统应该符合以下几个条件:

①一个系统不要求依赖产品实例如何被创建、组合和表达

②这个系统有多个系列产品,而系统中只消费其中某一系列产品

③系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现

五、抽象工厂模式(Abstract Factory)举例

举一个生活例子来形象地描述抽象工厂模式。某一个食品企业,在全国均有分店,它的产品有"产品A"和"产品B",由于北方和南方的口味并不一样,所以产品的生产会有所不同。

六、抽象工厂模式(Abstract Factory)实现

抽象工厂类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//定义抽象工厂
public abstract class AbstractFactory
{
	public abstract ProductAAbstract CreateProductAManager();
	public abstract ProductBAbstract CreateProductBManager();
}

抽象产品类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//定义产品A抽象类
public abstract class ProductAAbstract
{
    public abstract void ProductionLine(string where);
}
抽象产品类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//定义产品B抽象类
public abstract class ProductBAbstract
{
    public abstract void ProductionLine(string where);
}

具体工厂类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//北方的工厂
public class NorthManagerFactory : AbstractFactory
{
    public override ProductAAbstract CreateProductAManager()
    {
        return new ProductAManager();
    }
 
    public override ProductBAbstract CreateProductBManager()
    {
        return new ProductBManager();
    }
}

具体工厂类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//南方的工厂
public class SouthManagerFactory : AbstractFactory
{
    public override ProductAAbstract CreateProductAManager()
    {
        return new ProductAManager();
    }
 
    public override ProductBAbstract CreateProductBManager()
    {
        return new ProductBManager();
    }
}

具体产品类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//定义产品A抽象类的具体产品
public class ProductAManager : ProductAAbstract
{
    public override void ProductionLine(string where)
    {
        Debug.Log("商品A的口味:" + where);
    }
}

具体产品类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
//定义产品B抽象类的具体产品
public class ProductBManager : ProductBAbstract
{
    public override void ProductionLine(string where)
    {
        Debug.Log("商品B的口味:" + where);
    }
}

测试

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class AbstractFactoryTest : MonoBehaviour
{
    void Start()
    {
        AbstractFactory northManagerFactory = new NorthManagerFactory();
        ProductAAbstract aProductManager = northManagerFactory.CreateProductAManager();
        aProductManager.ProductionLine("北方");
        ProductBAbstract bProductManager = northManagerFactory.CreateProductBManager();
        bProductManager.ProductionLine("北方");
 
        //AbstractFactory southManagerFactory = new SouthManagerFactory();
        //ProductAAbstract aProductManager = southManagerFactory.CreateProductAManager();
        //aProductManager.ProductionLine("南方");
        //ProductBAbstract bProductManager = southManagerFactory.CreateProductBManager();
        //bProductManager.ProductionLine("南方");
    }
}
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值