C#設計模式之工廠模式(Factory)--04 抽象工廠模式中訪問具體產品類的屬性

前面三章中介紹了工廠模式的詳細結構,在實際應用中,我們有時候會要求能夠訪問到具體類的成員,當然這些成員不是抽象類中定義的,而是具體類中特有的,這時候該如何去做呢?先看以下代碼:
    //抽象工廠創建者基礎類
    //
    //
    //
    public abstract  class Creator
    {
        public abstract CDevice factory(int iIDTemp, string strNameTemp);
    }

    //抽象工廠,隔離開關設備創建者類
    //
    //
    //
    public class SwitchCreator : Creator
    {
        public override CDevice factory( int iIDTemp, string strNameTemp)
        {
            return new CSwitch(iIDTemp, strNameTemp);
        }
    }
    //抽象工廠,變壓器設備創建者類
    //
    //
    //
    public class TransfCreator : Creator
    {
        public override CDevice factory(int iIDTemp, string strNameTemp)
        {
            return new CTransf( iIDTemp, strNameTemp);
        }
    }

    //設備基類
    public abstract class CDevice
    {
  
        //設備ID
        private int iID;
        public  int ID
        {
            get
            {
                return iID;
            }
            set
            {
                iID = value;
            }
        }
        //設備名稱
        private string strName;
        public string Name
        {
            get
            {
                return strName;
            }
            set
            {
                strName = value;
            }
        }
        //構造函數
        public  CDevice()
        {

        }

        //加載
        public abstract void Load();
          
        //保存
        public abstract void Save();


    }
    //開關類
    public class CSwitch : CDevice
    {
        
        //開關狀態
        private bool bStatue;
        public bool Statue
        {
            get
            {
                return bStatue;
            }
            set
            {
                bStatue = value;
            }
        }
        //構造函數
        public CSwitch()
        {

        }
        //構造函數
        public CSwitch( int iIDTemp, string strNameTemp)
        {
            ID = iIDTemp;
            Name = strNameTemp;
	    bStatue=false;	
        }

        //加載
        public override void Load()
	{
		
	}
          
        //保存
        public override void Save()
	{
	}
    }
    //變壓器類
    public class CTransf : CDevice
    {
        
        //變壓器類型
        private int iType;
        public int Type
        {
            get
            {
                return iType;
            }
            set
            {
                iType= value;
            }
        }
        //構造函數
        public CTransf()
        {

        }
        //構造函數
        public CTransf( int iIDTemp, string strNameTemp)
        {
            ID = iIDTemp;
            Name = strNameTemp;
	    iType=0;	
        }

        //加載
        public override void Load()
	{
		
	}
          
        //保存
        public override void Save()
	{
	}
    }

以上代碼在程序中使用時:(如CSwith類)

Creator m_Creator = new CSwithCreator();
CDevice m_Device = m_Creator.factory( 1, "Swich1");
m_Device .Load();


如需訪問成員ID,則使用如下方式即可:

int iID=m_Device.ID;

但如果要訪問CSwith的bStatue成員時就會訪問不到。大笑我們可以在CDevice基類中引用建立一個CSwith對象成員,然後間接的訪問它,看代碼吧!


    //抽象工廠創建者基礎類
    //
    //
    //
    public abstract  class Creator
    {
        public abstract CDevice factory(int iIDTemp, string strNameTemp);
    }

    //抽象工廠,隔離開關設備創建者類
    //
    //
    //
    public class SwitchCreator : Creator
    {
        public override CDevice factory( int iIDTemp, string strNameTemp)
        {
            return new CSwitch(iIDTemp, strNameTemp);
        }
    }
    //抽象工廠,變壓器設備創建者類
    //
    //
    //
    public class TransfCreator : Creator
    {
        public override CDevice factory(int iIDTemp, string strNameTemp)
        {
            return new CTransf( iIDTemp, strNameTemp);
        }
    }


    public abstract class CDevice
    {
  
        //設備ID
        private int iID;
        public  int ID
        {
            get
            {
                return iID;
            }
            set
            {
                iID = value;
            }
        }
        //設備名稱
        private string strName;
        public string Name
        {
            get
            {
                return strName;
            }
            set
            {
                strName = value;
            }
        }
        //開關類
        private CSwitch m_SwitchRef;
        public CSwitch SwitchRef
        {
            get
            {
                return m_SwitchRef;
            }
            set
            {
                m_SwitchRef = value;
            }
        }
        //變壓器類
        private CTransf m_TransfRef;
        public CTransf TransfRef
        {
            get
            {
                return m_TransfRef;
            }
            set
            {
                m_TransfRef = value;
            }
        }
        //構造函數
        public  CDevice()
        {

        }

        //加載
        public abstract void Load();
          
        //保存
        public abstract void Save();


    }
    public class CSwitch : CDevice
    {
        
        //開關狀態
        private bool bStatue;
        public bool Statue
        {
            get
            {
                return bStatue;
            }
            set
            {
                bStatue = value;
            }
        }
        //構造函數
        public CSwitch()
        {

        }
        //構造函數
        public CSwitch( int iIDTemp, string strNameTemp)
        {
            SwitchRef = this;
            ID = iIDTemp;
            Name = strNameTemp;
	    bStatue=false;	
        }

        //加載
        public override void Load()
	{
		
	}
          
        //保存
        public override void Save()
	{
	}
    }
    public class CTransf : CDevice
    {
        
        //變壓器類型
        private int iType;
        public int Type
        {
            get
            {
                return iType;
            }
            set
            {
                iType= value;
            }
        }
        //構造函數
        public CTransf()
        {

        }
        //構造函數
        public CTransf( int iIDTemp, string strNameTemp)
        {
            TransfRef = this;
            ID = iIDTemp;
            Name = strNameTemp;
	    iType=0;	
        }

        //加載
        public override void Load()
	{
		
	}
          
        //保存
        public override void Save()
	{
	}
    }


在程序中使用時:

Creator m_Creator = new CSwithCreator();
CDevice m_Device = m_Creator.factory( 1, "Swich1");
bool bStatue=m_Device .SwitchRef.Statue;

這樣就OK了!

發佈了120 篇原創文章 · 獲贊 31 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章