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了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lujunql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值