工廠模式&IoC&DI

  • 工廠模式: 一種設計模式,讓不同的Client透過一個入口實作其所需要的工作。

  • IoC: 控制反轉,用來降低耦合,並且能夠抽換工作類別

相似:都是使用統一的入口並能夠抽換實作的物件,IoC的使用上比工廠模式進階。因為IoC可以透過依賴注入(DI)達到更靈活的使用

Example

A Dog Pet.

  • Eat
  • Sleep
  • Walk
public class Arvin 
{
    public void Play()
    {
        CallMyDog();
    }
    private void CallMyDog()
    {
            Dog dog = new Dog();
            Console.WriteLine("主人餵食了");
            dog.Eat();
            Console.WriteLine("主人帶去散步");
            dog.Walk();
            Console.WriteLine("主人說要睡覺了");
            dog.Sleep();
    }
}

情況:買了一隻貓

 public class Arvin
    {

        public void Play()
        {
            CallMyDog();
            Console.WriteLine("");
            CallMyCat();
        }

        private void CallMyDog()
        {
            Dog dog = new Dog();
            Console.WriteLine("主人餵食了");
            dog.Eat();
            Console.WriteLine("主人帶去散步");
            dog.Walk();
            Console.WriteLine("主人說要睡覺了");
            dog.Sleep();
        }

        private void CallMyCat()
        {
            Cat cat = new Cat();
            Console.WriteLine("主人餵食了");
            cat.Eat();
            Console.WriteLine("主人帶去散步");
            cat.Walk();
            Console.WriteLine("主人說要睡覺了");
            cat.Sleep();
        }
    }

缺點:

  • 增加飼養的寵物後代碼難以維護。
  • 解決方式:工廠模式
    • 將所有的寵物都歸納成動物(Animal)因為它們都有相同的行為模式
    • 建立IAnimal介面讓底下的寵物都實作此Interface,接著建立一個統一入口AnimalFactory類別並且包含一個CreatePet方法
  • IAnimal介面:擁有Eat(),Sleep(),Walk()方法
    • Dog,Cat繼承上面的
  • AnimalFactory類:用於產生寵物的方法CreatePet()

代碼示例

public class AnimalFactory
    {
        public enum AnimalType
        {
            Dog,
            Cat
        }
        public static IAnimal CreatePet(AnimalType pAnimalType)
        {
            switch (pAnimalType)
            {
                case AnimalType.Dog:
                    return new Dog();
                case AnimalType.Cat:
                    return new Cat();
                default:
                    return null;
            }
        }
    }

AnimalFactory會根據傳入的AnimalType參數決定產生哪個對應物件,而我的 Arvin Class 就可以修改成呼叫單一方法CallMyPet(AnimalFactory.AnimalType)

      public void Play()
        {
            CallMyPet(AnimalFactory.AnimalType.Dog);
            Console.WriteLine("");
            CallMyPet(AnimalFactory.AnimalType.Cat);
        }

        private void CallMyPet(AnimalFactory.AnimalType pAnimalType)
        {
            var factory = AnimalFactory.CreatePet(pAnimalType);
            Console.WriteLine("主人餵食了");
            factory.Eat();
            Console.WriteLine("主人帶去散步");
            factory.Walk();
            Console.WriteLine("主人說要睡覺了");
            factory.Sleep();
        }