程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 工廠模式之簡單工廠,工廠模式

工廠模式之簡單工廠,工廠模式

編輯:C#入門知識

工廠模式之簡單工廠,工廠模式


工廠模式定義:實例化對象,用工廠方法代替new操作。

接口(IBase)

public interface IBase
{
    void Excute();
}

實現類A(BaseAImpl):

public class BaseAImpl : IBase
{
    public void Excute()
    {
        Type type = this.GetType();
        Console.WriteLine("類全A名稱:{0},類名:{1},是否實現接口IBase:{2}", type.FullName, type.Name, typeof(IBase).IsAssignableFrom(type));
    }
}

實現類B(BaseBImpl):

public class BaseBImpl : IBase
{
    public void Excute()
    {
        Type type = this.GetType();
        Console.WriteLine("類B全名稱:{0},類名:{1},是否實現接口IBase:{2}", type.FullName, type.Name, typeof(IBase).IsAssignableFrom(type));
    }
}

類C(BaseC):(特殊類,用於區別)

public class BaseC 
{ 
    public void Excute()
    {
        Type type = this.GetType();
        Console.WriteLine("類全A名稱:{0},類名:{1},是否實現接口IBase:{2}", type.FullName, type.Name, typeof(IBase).IsAssignableFrom(type));
    }
}

工廠類(Factory):

/// <summary>
/// 工廠類
/// </summary>
public class Factory
{
    /// <summary>
    /// 工廠方法(創建實例的地方,需要什麼拿什麼)
    /// </summary>
    /// <param name="fullName">類型全名稱</param>
    /// <returns>實現IBase的實例對象</returns>
    public IBase CreateBase(string fullName)
    {
        // 獲取程序集裡面的所有類型
        Type[] types = this.GetType().Assembly.GetTypes();
        // 遍歷所有類型,查找
        foreach (Type type in types)
        {
            // 判斷類型全名稱和是否實現IBase接口
            if (type.FullName == fullName && typeof(IBase).IsAssignableFrom(type))
                return Activator.CreateInstance(type) as IBase;
        }

        return null;
    }
}

演示結果:

class Program
{
    static void Main(string[] args)
    {
        Factory factory = new Factory();
        IBase instanceA= factory.CreateBase(typeof(BaseAImpl).FullName);
        IBase instanceB = factory.CreateBase(typeof(BaseBImpl).FullName);
        IBase instanceC = factory.CreateBase(typeof(BaseC).FullName);  // 特殊例子,用於區別

        instanceA.Excute();
        instanceB.Excute();
        if (instanceC == null) 
        {
            Console.WriteLine("類C:{0}未實現接口IBase", typeof(BaseC).FullName);
        }   

        Console.ReadLine();
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved