最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET工廠方法模式講解

 更新時間:2016年11月29日 11:47:45   作者:Yangyi.He  
這篇文章主要為大家詳細介紹了ASP.NET工廠方法模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

工廠方法模式介紹:

工廠方法(Factory Method)模式的意義是定義一個創(chuàng)建產品對象的工廠接口,將實際創(chuàng)建工作推遲到子類當中。核心工廠類不再負責產品的創(chuàng)建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現(xiàn)的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進新的產品。

工廠方法模式結構圖:

角色分類:

抽象工廠角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創(chuàng)建的對象的工廠類必須實現(xiàn)這個接口。
具體工廠角色:這是實現(xiàn)抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,并且受到應用程序調用以創(chuàng)建產品對象
抽象產品角色:工廠方法模式所創(chuàng)建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。
具體產品角色:這個角色實現(xiàn)了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創(chuàng)建,它們之間往往一一對應。

引入實際例子:

在上一篇博文簡單工廠模式中,使用簡單工廠模式進行了以下實現(xiàn):如果有一個住戶管理系統(tǒng),里面的住戶類型是可變的,每一種租戶類型的租金計算公式都存在差異例如:A類型的住戶租金額=天數*單價+績效*0.005;B類型的住戶租金額=月份*(每月價格+performance*0.001)這里我們雖然實現(xiàn)了客戶的需求,但是如果客戶后期需要增加了C類型商店和D類型商店,而它們的算法要求又不一樣,這個時候我們就需要進行C,D類型商店的創(chuàng)建,并繼承Ishop接口,實現(xiàn)里面的方法,同時還得繼續(xù)修改工廠類在switc中增加case進行捕捉創(chuàng)建相應的商店對象,一旦出現(xiàn)這樣的情況,是不利于程序的擴展性和項目后期的維護性的。

1.分析:商店有共同的行為特征,都要進行店鋪租金計算行為,我們抽象了Ishop ,里面有待實現(xiàn)的計算商店租金方法行為。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FactoryEntiy
{
  public interface Ishop
  {
    double Getrent(int days, double dayprice, double performance);
  }
}

2.我們實現(xiàn)Isho接口里面的方法,創(chuàng)建A,B類型店鋪。

using FactoryEntiy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProductEnity
{
  /// <summary>
  /// 繼承商店接口,實現(xiàn)里面的行為方法,即算法
  /// </summary>
  public class Ashop:Ishop
  {
    /// <summary>
    /// /// A類型商店租金額,天數*單價+績效*0.005
    /// </summary>
    /// <param name="days">天數</param>
    /// <param name="dayprice">每天單價</param>
    /// <param name="performance">日平均績效</param>
    /// <returns></returns>
    public double Getrent(int days, double dayprice, double performance)
    {
      Console.WriteLine("A商店的租金算法");
      return days * dayprice + performance * 0.01;
    }
  }
}

using FactoryEntiy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProductEnity
{
  /// <summary>
  /// 繼承商店接口,實現(xiàn)里面的行為方法,即算法
  /// </summary>
  public class Bshop:Ishop
  {
    /// <summary>
    /// B類型商店的租金=月份*(每月價格+performance*0.001)
    /// </summary>
    /// <param name="month">月數</param>
    /// <param name="monthprice">月單價</param>
    /// <param name="performance">月平均績效</param>
    /// <returns></returns>
    public double Getrent(int month, double monthprice, double performance)
    {
      Console.WriteLine("B商店的租金算法");
      return month * (monthprice + performance * 0.001);
    }
  }
}

3.現(xiàn)在考慮在什么情況下創(chuàng)建商店的實體,對不同的商店進行租金計算,并且方便以后的增加和修改。于是我們創(chuàng)建IFactroy接口,里面有待實現(xiàn)的創(chuàng)建商店對象的方法。

using FactoryEntiy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FactoryMethod
{
  /// <summary>
  /// 工廠類,創(chuàng)建商店類型實體
  /// </summary>
  public interface IFactory
  {
    Ishop CreateShop();
  }
}

4.現(xiàn)在我們就可以繼承自IFactory,實現(xiàn)里面創(chuàng)建對應的商店對象了。

using FactoryEntiy;
using FactoryMethod;
using ProductEnity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProductEnity
{
  /// <summary>
  /// 繼承工廠類,創(chuàng)建A類型商店實體
  /// </summary>
  public class CreateBshop : IFactory
  {
    public Ishop CreateShop()
    {
      return new Ashop();
    }
  }
}

using FactoryEntiy;
using FactoryMethod;
using ProductEnity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProductEnity
{
  /// <summary>
  /// 繼承工廠類,創(chuàng)建B類型商店實體
  /// </summary>
  public class CreateAshop : IFactory
  {
    public Ishop CreateShop()
    {
      return new Bshop();
    }
  }
}

5.之后根據當前的商店類型進行判斷,該類型的商店應該進行哪一種算法:

using FactoryEntiy;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;

namespace FactoryMethod.App
{
  class Program
  {
    static void Main(string[] args)
    {
      string shopname = ConfigurationManager.AppSettings["CreateShopClassName"];
      //shopname為創(chuàng)建商店類名稱,此處=CreateAshop
      IFactory af = (IFactory)Assembly.Load("ProductEnity").CreateInstance("ProductEnity." + shopname);
      //第一個ProductEnity是dll的名稱,第二個ProductEnity是項目的命名空間。
      Ishop As = af.CreateShop(); double total = As.Getrent(30, 300, 2000); //30 天/100元 日平均績效為2000 
      Console.WriteLine("該A類型商店的租金為:" + total); 
      
      Console.WriteLine("=============");
      IFactory bf = (IFactory)Assembly.Load("ProductEnity").CreateInstance("ProductEnity." + "CreateBshop");
      //CreateBshop可以保存為配置或者存在數據庫中,
      //注意該保存字符串應該與項目中創(chuàng)建的類名一樣,
      //否則反射的方式會找不到該項目下的類。
      Ishop Bs = bf.CreateShop(); total = Bs.Getrent(30, 300, 2000); //30 天/100元 日平均績效為2000
      Console.WriteLine("該A類型商店的租金為:" + total);
    }
  }
}

這里我們使用反射的方式創(chuàng)建對象,替換了之前的工廠類通過switch創(chuàng)建對象的方式,有利于后面的新類型商店增加和算法修改增加和維護以后在項目需求在有變革,我們只需要重新在項目中增加C,D類型商店,繼承Ishop實現(xiàn)里面的方法,同時,添加繼承IFactroy接口,創(chuàng)建對應的商店對象編譯該項目的ProductEnity.dll,以后再進行計算該C,D類型的商店算法就可以通過反射的方式進行計算,不需要修改原來的工程類代碼。

整個項目的結構圖如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • .NET?Core(.NET6)中gRPC使用實踐

    .NET?Core(.NET6)中gRPC使用實踐

    gRPC是高性能的遠程過程調用(RPC)框架,本文主要介紹了.NET?Core(.NET6)中gRPC使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Asp.net之TextBox只允許輸入數字的方法總結

    Asp.net之TextBox只允許輸入數字的方法總結

    Asp.net之TextBox只允許輸入數字的方法總結,需要的朋友可以參考一下
    2013-02-02
  • ASP.NET用DataSet導出到Excel的方法

    ASP.NET用DataSet導出到Excel的方法

    ASP.NET用DataSet導出到Excel的方法,需要的朋友可以參考一下
    2013-03-03
  • asp.net使用DataSet的ReadXml讀取XML文件及Stream流的方法

    asp.net使用DataSet的ReadXml讀取XML文件及Stream流的方法

    這篇文章主要介紹了asp.net使用DataSet的ReadXml讀取XML文件及Stream流的方法,實例分析了asp.net以字符流的形式讀取與寫入xml文件的相關技巧,需要的朋友可以參考下
    2016-06-06
  • asp.net css控制打印功能方法實例

    asp.net css控制打印功能方法實例

    這篇文章介紹了asp.net css控制打印功能方法實例,有需要的可以參考一下
    2013-10-10
  • 輕量級ORM框架Dapper應用之返回多個結果集

    輕量級ORM框架Dapper應用之返回多個結果集

    這篇文章介紹了使用Dapper返回多個結果集的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • ASP.NET Core中如何使用表達式樹創(chuàng)建URL詳解

    ASP.NET Core中如何使用表達式樹創(chuàng)建URL詳解

    這篇文章主要給大家介紹了關于ASP.NET Core中如何使用表達式樹創(chuàng)建URL的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • asp.net使用AJAX實現(xiàn)無刷新分頁

    asp.net使用AJAX實現(xiàn)無刷新分頁

    AJAX(Asynchronous JavaScript and XML)是一種進行頁面局部異步刷新的技術。用AJAX向服務器發(fā)送請求和獲得服務器返回的數據并且更新到界面中,不是整個頁面刷新,而是在頁面中使用Js創(chuàng)建XMLHTTPRequest對象來向服務器發(fā)出請求以及獲得返回的數據。
    2014-11-11
  • ASP.NET通過分布式Session提升性能

    ASP.NET通過分布式Session提升性能

    我們將會談到的是ASP.NET通過分布式Session來構建高性能可擴展的ASP.NET網站
    2012-01-01
  • 詳解ASP.NET Core 中間件之壓縮、緩存

    詳解ASP.NET Core 中間件之壓縮、緩存

    本篇文章主要介紹了ASP.NET Core 中間件之壓縮、緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12

最新評論

平陆县| 金平| 蒲城县| 上思县| 宁蒗| 辽中县| 桦甸市| 晋江市| 遂平县| 和平县| 武宣县| 汶川县| 潮安县| 桂东县| 莱芜市| 福建省| 海伦市| 凌海市| 阿勒泰市| 酒泉市| 石屏县| 璧山县| 石门县| 聊城市| 革吉县| 鱼台县| 苍南县| 东光县| 北川| 四会市| 长丰县| 报价| 类乌齐县| 浮山县| 平远县| 石景山区| 清新县| 清水县| 海伦市| 民县| 攀枝花市|