抽象工厂(AbstractFactory)

1、抽象工厂

上篇文章说了工厂方法那么可能有同学有疑问了,既然都已经有工厂方法了,为什么还需要一个抽象工厂呢?抽象工厂是为了解决什么问题呢?在工厂方法中,一个工厂类只负责一个产品的创建,这就比较单一了,比如一个生产处理器的工厂,他可能生产的有i9的处理器,也可能有i5,i3等等,这些都是处理器,这样的话,直接用一个工厂类就不太好了,这时候咱们用抽象工厂。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的类。

接下来咱们来开发一个游戏,叫暴力摩托。这个游戏有两种模式,一种是普通模式,一种是魔法模式
普通模式开摩托,手拿AK47
魔法模式骑扫把,手拿魔法棒
咱们先来画个类图:

6375263-a789bedd0eea87d3.png
image.png
,大概就是这样,但是看起来有点乱,调整下位置。如下图。
6375263-0bf5851b24e4f650.png
image.png

这样看起来就舒服多了,咱们来简单分析一下这个类图,两个接口 IWeaponIVehicle,一个抽象工厂类,提供了创建两个类的接口。然后就是两个类,一个普通模式的 DefaultFactory 一个魔法模式 MagicFactory,这两个类继承自抽象工厂接口类 AbstractFactory,然后就是ak47,摩托,魔法攻击。魔法扫把,四个类的具体实现。
然后看代码。

2、代码部分。

IAbstractFactory.cs

namespace AbstractFactory
{
    interface IAbstractFactory
    {
        IWeapon CreateIWeapon();  //提供类的创建接口。
        IVehicle CreateIVehicle();
    }
}

NormalFactory.cs

namespace AbstractFactory
{
    class NormalFactory:IAbstractFactory
    {
        public IWeapon CreateIWeapon()
        {
            return new AK47();
        }
        public IVehicle CreateIVehicle()
        {
            return new Moto();
        }
    }
}

MagicFactory.cs

namespace AbstractFactory
{
    class MagicFactory:IAbstractFactory 
    {
        public IWeapon CreateIWeapon()
        {
            return new MagicStick ();
        }
        public IVehicle CreateIVehicle()
        {
            return new Broom ();
        }
    }
}

IVehicle.cs

namespace AbstractFactory
{
    interface IVehicle
    {
        void Run();
    }
}

IWeapon.cs

namespace AbstractFactory
{
    interface IWeapon
    {
        void Attack();
    }
}

AK47.cs

using System;
namespace AbstractFactory
{
    class AK47:IWeapon
    {
        public void Attack()
        {
            Console.WriteLine("AK47");
        }
    }
}

Moto.cs

using System;

namespace AbstractFactory
{
    class Moto:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("Moto...嘟嘟嘟");
        }
    }
}

Broom.cs

using System;

namespace AbstractFactory
{
    class Broom:IVehicle
    {
        public void Run()
        {
            Console.WriteLine("Broom...");
        }

    }
}

MagicStick.cs

using System;
namespace AbstractFactory
{
    class MagicStick : IWeapon
    {
        public void Attack()
        {
            Console.WriteLine("MagicStick...");
        }
    }
}

最后看下program里是如何调用的。

namespace AbstractFactory
{
    class Program
    { 
        static void Main(string[] args)
        {
            IAbstractFactory a = new NormalFactory();
            a.CreateIVehicle().Run();
            a.CreateIWeapon().Attack();
        }
    }
}

3、结语

Study hard and make progress every day.

更多学习资料请关注"爱游戏爱编程"。


6375263-578835b1e5aa99fa.jpg
爱游戏爱编程.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李公子lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值