首頁  >  文章  >  後端開發  >  .NET簡單工廠模式解說

.NET簡單工廠模式解說

高洛峰
高洛峰原創
2016-12-20 13:19:481304瀏覽

簡單工廠模式介紹:

簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定創建哪一種產品類別的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。

結構模式圖:

.NET簡單工廠模式解說

角色分類:

工廠(Creator)角色
簡單工廠模式的核心,它負責實現所有實例的內部邏輯。工廠類別的創建產品類別的方法可以被外界直接調用,創建所需的產品物件。

抽象產品(Product)角色
簡單工廠模式所建立的所有物件的父類,它負責描述所有實例所共有的公共介面。

具體產品(Concrete Product)角色
是簡單工廠模式的創建目標,所有創建的物件都是充當這個角色的某個具體類別的實例。

引入實際情況:

如果有一個住戶管理系統,裡面的住戶類型是可變的,每一種租戶類型的租金計算公式都存在差異

A類型的住戶租金額=天數*單價+績效*0.005

B類型的住戶租金額=月份*(每月價格+performance*0.001)

分析:

1. 商店存在共有的計算方法,這是實體商店的行為,然而他們的行為的方式不一樣,所有我們抽象商店類,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace SimpleFactory.App.IFactroy
{
   
  public interface Ishop
  {
    double Getrent(int days, double dayprice, double performance);
  }
}

   

2.在抽象了商店之後,我們要對創建具體產品類,這裡就是具體的類型商店,裡面實現該商店的行為方法。創建A類型的商​​店

using SimpleFactory.App.IFactroy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace SimpleFactory.App.product
{
  //A类型的商店的创建
  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;
    }
  }
}

   

3.創建B類型的商店:

using SimpleFactory.App.IFactroy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace SimpleFactory.App.product
{
  /// <summary>
  /// B类型的商店的创建
  /// </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);
    }
  }
}

   

4. 在創建號於是簡單工廠模式中最核心的部分:工廠類別出來了

using SimpleFactory.App.IFactroy;
using SimpleFactory.App.product;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace SimpleFactory.App.factoryMethod
{
  public class factorymethod
  {
    public Ishop CreateShow(string show)
    {
      switch (show.Trim().ToLower())
      {
        case"ashop":
          return new Ashop();
        case "bshop":
          return new Ashop();
        default:
          throw new Exception("该商店不存在");
      }
    }
  }
}

   

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

using SimpleFactory.App.factoryMethod;
using SimpleFactory.App.IFactroy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace SimpleFactory.App
{
  class Program
  {
    static void Main(string[] args)
    {
      Ishop As;
      factorymethod afm = new factorymethod();
      As = afm.CreateShow("ashop"); //a 类型的某商店
      double total = As.Getrent(30, 300, 2000);   //30 天/100元 日平均绩效为2000
      Console.WriteLine("该A类型商店的租金为:" + total);
 
      Console.WriteLine("=============");
 
      Ishop Bs;
      factorymethod bfm = new factorymethod();
      Bs = bfm.CreateShow("bshop"); //b 类型的某商店
      total = Bs.Getrent(3, 3000, 60000);     //3 月/4000元 月平均绩效为60000
      Console.WriteLine("该B类型商店的租金为:" + total);
      Console.ReadKey();
    }
  }
}

   

到這裡我們實現了客戶要求的兩種類型商店的演算法的需求,但是作為一種好的設計架構,還應該考慮到後面的需求變革,如果客戶現在又增加了C類型商店和D類型商店,它們的演算法要求又不一樣,這個時候我們就需要進行C,D類型商店的創建,並繼承Is​​hop接口,實現裡面的方法,同時還得繼續修改工廠類在switc中增加case進行捕捉創建相應的商店對象,一旦出現這樣的情況,是不利於程序的擴展性和專案後期的維護性的。

優點:

簡單工廠模式能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。透過它,外界可以從直接創造特定產品對  象的尷尬局面中擺脫出來。

外界與具體類隔離開來,偶聯性低。

明確區分了各自的職責和權力,有利於整個軟體體系結構的最佳化。

缺點:

工廠類別集中了所有實例的創建邏輯,容易違反GRASPR的高內聚的責任分配原則

雖然簡單工廠模式能夠適應一定的變化,但是它所能解決的問題是遠遠有限的。它所能創建的類別只能是事先教考慮到的,如果需要添加新的類,則需要改變工廠類了。

出現的上訴情況,應該如何解決,值得思考,將在下一個工廠方法模式中得到很好的解決。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn