美文网首页
抽象工厂(AbstractFactory)

抽象工厂(AbstractFactory)

作者: 十柒年 | 来源:发表于2018-12-12 11:42 被阅读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

    相关文章

      网友评论

          本文标题:抽象工厂(AbstractFactory)

          本文链接:https://www.haomeiwen.com/subject/klyehqtx.html