C#簡單原廠模式是什嗎?

來源:互聯網
上載者:User
題目:做一個商場收銀的小程式,可能會出現的情況包括:正常收費,九折優惠,七折優惠,滿300減50等各種不同隨時會變化的優惠活動。

介面如下:

分析:

首先我們對於收錢寫一個父類CashSuper。這個父類是用來包含其他的各種收費方式的:正常收費、七折優惠、八折優惠、九折優惠、滿300減50、滿400減70、滿500減100等情況,其中折扣優惠雖然不同,但是類型相似,滿減優惠同理,故此我們可以將正常收費、折扣優惠與滿減優惠分別劃分為三個不同的類:CashNormal、CashRebate、CashReturn。

而CashSuper這個父類是用於繼承的,所以我們設定為abstract用來被重寫的,其次這個父類所包含的的三個子類都會共同調用到一個參數:那就是實際需要收到的商品的價格,所以我們的參數只需要傳進來共同的參數:acceptMoney即可。

1 abstract class CashSuper2     {3         public abstract double acceptCash(double acceptMoney);4     }

然後就是正常收費:CashNormal

首先他從父類獲得參數是實際需要收到的商品的價格,他本身事正常收費沒有任何的優惠,所以直接返回從父類傳進來的值即可。

1     class CashNormal : CashSuper2     {3         public override double acceptCash(double acceptMoney)4         {5             return acceptMoney;6         }7     }

折扣優惠:CashRebate

他和正常收費類似,繼承於父類CashSuper,會獲得來自於父類的參數,得到實際需要收到的商品的價格,但是他需要實現的是對商品進行打折優惠,所以他需要自己定義一個折扣優惠參數,這樣別人調用他的時候將折扣參數傳進來,他就可以通過對原價進行折扣優惠反饋給使用者了。

 1     class CashRebate : CashSuper 2     { 3         //這就是cashrebate的屬性了 4         private double monRebate = 1; 5  6         //調用CashRebate的時候需要從外面將優惠程度傳進來 7         public CashRebate(string moneyRebate) 8         { 9             this.monRebate = double.Parse(moneyRebate);10         }11 12         public override double acceptCash(double acceptMoney)13         {14             return acceptMoney * monRebate;15         }16     }

滿減優惠:CashReturn

這個與折扣優惠類似了,只是他有兩個參數而已:滿減的水平線,和減扣多少。故此給此類定義兩個參數即可。

 1     class CashReturn : CashSuper 2     { 3         //這就是cashreturn的屬性了 4         private double CashLevel = 0; 5         private double MoneyReturn = 0; 6  7         //對外調用函數所以必須是public 8         public CashReturn(string level,string MonReturn) 9         {10             this.CashLevel = double.Parse(level);11             this.MoneyReturn = double.Parse(MonReturn);12         }13 14         public override double acceptCash(double acceptMoney)15         {16             double result = acceptMoney;17             if (acceptMoney >= CashLevel)18             {19                 result = acceptMoney - Math.Floor(acceptMoney / CashLevel) * MoneyReturn;20             }21             return result;22         }23     }

現在獲得了幾種優惠情況了,但是我們需要判斷什麼時候需要調用哪種優惠情況,這點我們通過使用者的選擇,使用者將選擇的優惠方式傳輸過來,我們再確定調用哪一種優惠方式,這就是利用簡單原廠模式,將所有的優惠方式封裝好,在進一步調用。

 1     class CashFactory 2     { 3         //CashSuper現在就類似double之類,傳回值就是CashSuper 4         public static CashSuper createCashAccept(string type) 5         { 6             CashSuper cs = null; 7  8             switch (type) 9             {10                 case "正常收費":11                     cs = new CashNormal();12                     break;13                 case "滿300減50":14                     cs = new CashReturn("300", "50");15                     break;16                 case "滿500減100":17                     cs = new CashReturn("500", "100");18                     break;19                 case "滿400減70":20                     cs = new CashReturn("400", "70");21                     break;22                 case "滿900減200":23                     cs = new CashReturn("900", "200");24                     break;25                 case "八折優惠":26                     cs = new CashRebate("0.8");27                     break;28                 case "九折優惠":29                     cs = new CashRebate("0.9");30                     break;31                 case "七折優惠":32                     cs = new CashRebate("0.7");33                     break;34             }35             return cs;36         }37     }

最後在使用者介面調用上面的函數即可。

 1         private void ok_button_Click(object sender, EventArgs e) 2         { 3             /**對外這邊需要瞭解兩個函數 4              * 1.CashFactory.createCashAccept,這個是為了確定每一次的購物時調用的哪一種優惠方式 5              * 2.csuper.acceptCash,這個是為了獲得每種優惠方式獲得的優惠結果 6              */ 7             CashSuper csuper = CashFactory.createCashAccept(typecomboBox.SelectedItem.ToString()); 8              9             totalPrices = csuper.acceptCash(double.Parse(unitPrice_textBox.Text) * double.Parse(amount_textBox.Text));10             total += totalPrices;11             listBox1.Items.Add("單價:" + unitPrice_textBox.Text.ToString() + " 數量:" + amount.ToString() + "  " + typecomboBox.SelectedItem.ToString() + " 合計:" + totalPrices.ToString());12             resultLabel.Text = total.ToString();13         }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.