CSharp: Abstract Factory in donet core 3

 

 /// <summary>
    /// Abstract Factory抽像工厂
    /// geovindu,Geovin Du  eidt
    /// </summary>
    public interface IShape
    {
        void Draw();
    }
    /// <summary>
    /// 
    /// </summary>
    public class Square : IShape
    {
        public void Draw() => Console.WriteLine("Basic square");
    }
    /// <summary>
    /// 
    /// </summary>
    public class Rectangle : IShape
    {
        public void Draw() => Console.WriteLine("Basic rectangle");
    }
    /// <summary>
    /// 
    /// </summary>
    public class RoundedSquare : IShape
    {
        public void Draw() => Console.WriteLine("Rounded square");
    }
    /// <summary>
    /// 
    /// </summary>
    public class RoundedRectangle : IShape
    {
        public void Draw() => Console.WriteLine("Rounded rectangle");
    }
    /// <summary>
    /// 
    /// </summary>
    public enum Shape
    {
        Square,
        Rectangle
    }
    /// <summary>
    /// 
    /// </summary>
    public abstract class ShapeFactory
    {
        public abstract IShape Create(Shape shape);
    }
    /// <summary>
    /// 
    /// </summary>
    public class BasicShapeFactory : ShapeFactory
    {
        public override IShape Create(Shape shape)
        {
            switch (shape)
            {
                case Shape.Square:
                    return new Square();
                case Shape.Rectangle:
                    return new Rectangle();
                default:
                    throw new ArgumentOutOfRangeException(
                      nameof(shape), shape, null);
            }
        }
    }
    /// <summary>
    /// 
    /// </summary>
    public class RoundedShapeFactory : ShapeFactory
    {
        public override IShape Create(Shape shape)
        {
            switch (shape)
            {
                case Shape.Square:
                    return new RoundedSquare();
                case Shape.Rectangle:
                    return new RoundedRectangle();
                default:
                    throw new ArgumentOutOfRangeException(nameof(shape), shape, null);
            }
        }
    }
    /// <summary>
    /// 
    /// </summary>
    public class Demo
    {
        public static ShapeFactory GetFactory(bool rounded)
        {
            if (rounded)
                return new RoundedShapeFactory();
            else
                return new BasicShapeFactory();
        }

    }

  

  /// <summary>
    /// Abstract Factory抽像工厂
    /// geovindu,Geovin Du  eidt
    /// </summary>
    public interface IAnimalFactory
    {
        IDog GetDog();
        ITiger GetTiger();
    }

    /// <summary>
    /// Abstract Product-1
    /// </summary>
    public interface ITiger
    {
        void AboutMe();
    }
    /// <summary>
    /// Abstract Product-2
    /// </summary>
    public interface IDog
    {
        void AboutMe();
    }

    /// <summary>
    /// Concrete product-A1(WildTiger)
    /// </summary>
    class WildTiger : ITiger
    {
        public void AboutMe()
        {
            Console.WriteLine("涂氏 tiger says: I prefer hunting in jungles.Halum.");
        }
    }
    /// <summary>
    ///  Concrete product-B1(WildDog)
    /// </summary>
    class WildDog : IDog
    {
        public void AboutMe()
        {
            Console.WriteLine("涂氏 dog says: I prefer to roam freely in jungles.Bow-Wow.");
        }
    }

    /// <summary>
    /// Concrete product-A2(PetTiger)
    /// </summary>
    class PetTiger : ITiger
    {

        /// <summary>
        /// 
        /// </summary>
        public void AboutMe()
        {
            Console.WriteLine("李氏 tiger says: Halum.I play in an animal circus.");
        }
    }

    /// <summary>
    /// Concrete product-B2(PetDog)
    /// </summary>
    class PetDog : IDog
    {
        public void AboutMe()
        {
            Console.WriteLine("李氏 dog says: Bow-Wow.I prefer to stay at home.");
        }
    }
    /// <summary>
    /// Concrete Factory 1-Wild Animal Factory
    /// </summary>
    public class WildAnimalFactory : IAnimalFactory
    {

        public ITiger GetTiger()
        {
            return new WildTiger();
        }
        public IDog GetDog()
        {
            return new WildDog();
        }
    }
    /// <summary>
    /// Concrete Factory 2-Pet Animal Factory
    /// </summary>
    public class PetAnimalFactory : IAnimalFactory
    {
        public IDog GetDog()
        {
            return new PetDog();
        }

        public ITiger GetTiger()
        {
            return new PetTiger();
        }
    }
    /// <summary>
    /// Factory provider
    /// </summary>
    class FactoryProvider
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="factoryType"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static IAnimalFactory GetAnimalFactory(string factoryType)
        {
            if (factoryType.Contains("涂氏"))
            {
                // Returning a WildAnimalFactory
                return new WildAnimalFactory();
            }
            else        
           if (factoryType.Contains("李氏"))
            {
                // Returning a PetAnimalFactory
                return new PetAnimalFactory();
            }
            else
            {
                throw new ArgumentException("You need to pass either wild or pet as argument.");
            }
        }
    }

  

调用:

 //Abstract Factory抽像工厂
            Console.WriteLine("***Abstract Factory Pattern Demo.***\n");

            //Making a wild dog and wild tiger through WildAnimalFactory
            IAnimalFactory animalFactory = FactoryProvider.GetAnimalFactory("涂氏");
            IDog dog = animalFactory.GetDog();
            ITiger tiger = animalFactory.GetTiger();
            dog.AboutMe();
            tiger.AboutMe();

            Console.WriteLine("******************");

            //Making a pet dog and pet tiger through PetAnimalFactory now.
            animalFactory = FactoryProvider.GetAnimalFactory("李氏");
            dog = animalFactory.GetDog();
            tiger = animalFactory.GetTiger();
            dog.AboutMe();
            tiger.AboutMe();

            //
            var basic = Demo.GetFactory(false);
            var basicRectangle = basic.Create(Shape.Rectangle);
            basicRectangle.Draw();

            var roundedSquare = Demo.GetFactory(true).Create(Shape.Square);
            roundedSquare.Draw();

            Console.ReadLine();

  

输出:

***Abstract Factory Pattern Demo.***

涂氏 dog says: I prefer to roam freely in jungles.Bow-Wow.
涂氏 tiger says: I prefer hunting in jungles.Halum.
******************
李氏 dog says: Bow-Wow.I prefer to stay at home.
李氏 tiger says: Halum.I play in an animal circus.
Basic rectangle
Rounded square
***Abstract Factory Pattern Demo.***

  

 

posted @ 2022-10-04 17:19  ®Geovin Du Dream Park™  阅读(22)  评论(0编辑  收藏  举报