天天看點

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

第一個例子 普通的多态

第二個例子 運用工廠解除依賴耦合

第三個例子 剛是運用了依賴注入徹底解耦 借用spring.net 

     (1)也許有人說,IoC和工廠模式不是一樣的作用嗎,用IoC好象還麻煩一點。

   舉個例子,如果使用者需求發生變化,要把Chinese類修改一下。那麼前一種工廠模式,就要更改Factory類的方法,并且重新編譯布署。而IoC隻需要将class屬性改變一下,這些對象是動态生成的,這時我們就可以熱插撥Chinese對象(不必把原程式停止下來重新編譯布署)

  (2)也許有人說,即然IoC這麼好,那麼我把系統所有對象都用IoC方式來生成。

   注意,IoC的靈活性是有代價的:設定步驟麻煩、生成對象的方式不直覺、比正常生成對象在效率上慢一點。是以使用IoC要看有沒有必要,我認為比較通用的判斷方式是:用到工廠模式的地方都可以考慮用IoC模式。

  (3)關于IoC的低侵入性。

   什麼是低侵入性?如果你用過MVC或Nhibernate就會發現,要繼承一些接口或類,才能利用它們的架構開發。這樣,系統就被綁定在MVC、Nhibernate上了,對系統的可移植性産生不利的影響。如果代碼中很少涉及某一個架構的代碼,那麼這個架構就可以稱做是一個低侵入性的架構。

第一個例子是最明顯的耦合 他沒有畫圖 我給加了張圖 vs中自帶的類圖裡怎麼也找不着依賴的箭頭...我自己畫了個箭頭 不是很好看...!

  /// <summary>

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    /// 抽象人類

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    /// </summary>

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public abstract class Person

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    {

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// <summary>

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 使用工具勞動

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// </summary>

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        public abstract void Work();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    }

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public interface ITool

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 使用工具

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        void UseTool();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

  場景一,原始社會:原始人使用長矛打獵

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public class Spear : ITool

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        public void UseTool()

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        {

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.WriteLine("使用長矛");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        }

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public class PrimitivePerson : Person

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 原始社會使用長矛打獵

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        public override void Work()

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            //知道打獵使用的是長矛,并且制造長矛

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            ITool tool = new Spear();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            tool.UseTool();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.WriteLine("使用長矛打獵");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

從上面代碼我們不難看出,雖然使用的經典的裡氏替換原則,但PrimitivePerson類于Spear類存在着耦合。

第二段代碼 運用工廠

可以看到它加了一個工廠 包裝了執行個體化 使得PrimitivePerson與Hoe沒有直接存在耦合  但是工廠與PrimitivePerson之間還是有關系的 而且這種簡單工廠往往會違背開閉原則(如有錯誤 求拍磚!)

 場景二,經濟社會:使用工具耕作

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public class Hoe : ITool

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.WriteLine("使用鋤頭");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public static class ToolFactory

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 工廠制造工具

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// <returns></returns>

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        public static ITool CreateTool()

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            return new Hoe();  // 制造鋤頭

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public class EconomyPerson : Person

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 經濟社會使用鋤頭耕作

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            //不用知道什麼工具,隻需知道工廠能買到工具,而不自己制造工具,但僅由工廠制造鋤頭

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            ITool tool = ToolFactory.CreateTool();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.WriteLine("經濟社會使用工具耕作");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

第三段 運用依賴注入

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public class Computer : ITool

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.WriteLine("使用電腦");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    public class ModernPerson : Person

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 從外部擷取工具

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        public ITool Tool { get; set; }

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        /// 現在人用不需要知道電腦是哪來的,直接拿來辦公

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            //不知道使用什麼工具和哪來的工具,隻是機械化的辦公

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Tool.UseTool();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.WriteLine("使用工具辦公");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <sectionGroup name="spring">

      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />

      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />

    </sectionGroup>

  </configSections>

  <spring>

    <context>

      <resource uri="config://spring/objects" />

    </context>

    <objects xmlns="http://www.springframework.net">

      <description>一個簡單的控制反轉例子</description>

      <object id="computer" type="SpringNetIoC.Computer, SpringNetIoC" />

      <object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">

        <property name="Tool" ref="computer"/>

      </object>

    </objects>

  </spring>

</configuration>

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

    class Program

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

        static void Main(string[] args)

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            IApplicationContext ctx = ContextRegistry.GetContext();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Person person = (Person)ctx.GetObject("modernPerson");

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            person.Work();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

            Console.ReadLine();

普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別
普通接口、多态、工廠模式、依賴注入三者的耦合強度差別

從上面代碼我們可以看出,把對象交給Spring.NET容器進行管理,ModernPerson類不需要知道具體使用什麼工具,僅僅是機械化的工作。至于使用的什麼工具,則由配置檔案決定,所有對象由Spring.NET容器管理,這樣可以實作動态的拆裝組建群組件重用。我個人了解依賴注入是反射工廠的加強版。