1. 程式人生 > >c# 設計模式 之:工廠模式之---工廠模式

c# 設計模式 之:工廠模式之---工廠模式

gas exec load common pre bubuko 技術分享 ron deb

1、uml類圖:

技術分享圖片

技術分享圖片

實現和依賴關系:

實現:

  SportFactory、JeepFactory、HatchbackFactory 實現 IFactory 接口

  SportCar、JeepCar、HatchbackCar 實現 ICar 接口

依賴:

  IFactory 依賴 ICar

  SportFactory 依賴 SportCar

  JeepFactory 依賴 JeepCar

  HatchbackFactory 依賴 HatchbackCar

  Client依賴 IFactory 和 ICar

2、代碼實現:

抽象工廠代碼:

namespace CNBlogs.DesignPattern.Common
{
    
public interface IFactory { ICar CreateCar(); } }

抽象產品代碼:

namespace CNBlogs.DesignPattern.Common
{
    public interface ICar
    {
        void GetCar();
    }
}

具體工廠代碼:

namespace CNBlogs.DesignPattern.Common
{
    /// <summary>
    ///  具體工廠類: 用於創建跑車類
    /// </summary>
public class SportFactory : IFactory { public ICar CreateCar() { return new SportCar(); } } /// <summary> /// 具體工廠類: 用於創建越野車類 /// </summary> public class JeepFactory : IFactory { public ICar CreateCar() {
return new JeepCar(); } } /// <summary> /// 具體工廠類: 用於創建兩廂車類 /// </summary> public class HatchbackFactory : IFactory { public ICar CreateCar() { return new HatchbackCar(); } } }

具體產品代碼:

namespace CNBlogs.DesignPattern.Common
{
    /// <summary>
    /// 具體產品類: 跑車
    /// </summary>
    public class SportCar : ICar
    {
        public void GetCar()
        {
            Console.WriteLine("場務把跑車交給範·迪塞爾");
        }
    }

    /// <summary>
    /// 具體產品類: 越野車
    /// </summary>
    public class JeepCar : ICar
    {
        public void GetCar()
        {
            Console.WriteLine("場務把越野車交給範·迪塞爾");
        }
    }

    /// <summary>
    /// 具體產品類: 兩箱車
    /// </summary>
    public class HatchbackCar : ICar
    {
        public void GetCar()
        {
            Console.WriteLine("場務把兩箱車交給範·迪塞爾");
        }
    }
}

客戶端代碼:

  static void Main(string[] args)
        {
            // 工廠類的類名寫在配置文件中可以方便以後修改
            string factoryType = ConfigurationManager.AppSettings["FactoryType"];
            // 利用.NET提供的反射可以根據類名來創建它的實例,非常方便
            var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
            IFactory factory = Assembly.LoadFrom(currentAssembly.CodeBase).CreateInstance(factoryType) as IFactory;
            ICar car = factory.CreateCar();
            car.GetCar();
            Console.ReadKey();
        }

App.config:

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

  <appSettings>
    <add key="FactoryType" value="CAFactory.HatchbackFactory"/>
  </appSettings>

</configuration>

c# 設計模式 之:工廠模式之---工廠模式