抽象工厂(AbstractFactory)

2018-12-12  本文已影响32人  十柒年

1、抽象工厂

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

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

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

image.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.

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


爱游戏爱编程.jpg
上一篇下一篇

猜你喜欢

热点阅读