網站首頁 編程語言 正文
這是我們用得比較多的一種設計模式,也是23種標準設計模式之一,使用前面講的簡單工廠設計模式,遇到具體產品經常變換時就不太適合了,違反了開閉設計原則;怎么才能避免修改工廠類呢?工廠方法模式可以做到。
工廠方法模式要求我們應該有一個抽象的工廠類,我們知道盡量使用抽象類或接口來定義就可以達到一個開閉原則的效果,這樣我們在抽象的工廠類定義一個生產產品的方法,這個方法就是工廠方法,這也是工廠方法模式的由來,他具體的行為會有他的子類或實現類來實現。如果想生產某種產品,就定義一個新的產品,新的產品工廠類,這樣就實現了不同的產品進行一個不同的創建,這樣如果有信的產品,只需要添加新的工廠類,原來寫好的代碼不會發生變化,這種方式符合開閉原則,可擴展比較好。
添加一個具體產品,只需要在添加一個具體產品的工廠類實現抽象工廠類,不需要修改原來的代碼
示例代碼:
抽象產品類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { /* 動物抽象類 * 抽象產品 */ public abstract class Animal { public abstract void Eat(); } }
抽象工廠類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { /* 動物抽象工廠類 */ public abstract class AnimalFactory { public abstract Animal GetAnimal(); } }
生產狗的具體工廠類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 具體工廠:生成狗 /// public class DogFactory :AnimalFactory { public override Animal GetAnimal() { return new Dog(); } } }
生產企鵝的具體工廠類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 具體工廠:生成企鵝 /// public class PenguinFactory :AnimalFactory { public override Animal GetAnimal() { return new Penguin(); } } }
具體產品狗類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { /* 具體的產品類,實現抽象產品類 */ public class Dog:Animal { // 實現抽象方法 public override void Eat() { Console.WriteLine("狗在吃飯!"); } } }
具體產品企鵝類:
?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { /* 具體產品類,實現抽象產品類 */ public class Penguin : Animal { // 實現抽象方法 public override void Eat() { Console.WriteLine("企鵝在吃飯!"); } } }
客戶端調用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { class Program { static void Main(string[] args) { AnimalEat(new DogFactory()); Console.ReadKey(); } static void AnimalEat(AnimalFactory af) { Animal am = af.GetAnimal(); am.Eat(); } } }
類圖:
如果想在增加一個Cat類,只需要增加一個具體的Cat類實現Animal類的方法,增加一個具體的Cat工廠類實現抽象工廠類即可,不需要在修改已經寫好的代碼,符合開閉原則。
使用接口的方式實現工廠模式
需求:使用面向對象的方式設計一個系統,描述使用卡車從事貨運,使用公共汽車從事客運。使用工廠模式實現。
1、汽車接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 汽車接口 /// public interface ICar { ////// 描述汽車從事的活動 /// void Work(); } }
2、分別定義卡車(Truck)和公共汽車(Bus)類實現汽車接口(ICar)里面的Work()方法
Truck類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 卡車類 /// public class Truck : ICar { ////// 卡車從事的活動 /// public void Work() { Console.WriteLine("卡車從事貨運"); } } }
Bus類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 公共汽車類 /// public class Bus:ICar { ////// 公共汽車從事的活動 /// public void Work() { Console.WriteLine("公共汽車從事客運"); } } }
3、定義汽車的工廠接口(ICarFactory):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 汽車工廠接口 /// public interface ICarFactory { ICar GetCar(); } }
4、分別定義卡車工廠(TruckFactory)和公共汽車工廠(BusFactory)實現ICarFactory接口
TruckFactory工廠:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 卡車工廠接口 /// public class TruckFactory:ICarFactory { ////// 返回卡車類 /// ///public ICar GetCar() { return new Truck(); } } }
BusFactory工廠:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { ////// 公共汽車工廠 /// public class BusFactory:ICarFactory { ////// 返回公共汽車類 /// ///public ICar GetCar() { return new Bus(); } } }
5、主程序調用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工廠模式 { class Program { static void Main(string[] args) { CarWork(new TruckFactory()); Console.ReadKey(); } ////// 根據汽車工廠返回具體的汽車類 /// /// static void CarWork(ICarFactory cf) { ICar c = cf.GetCar(); c.Work(); } } }
6、程序運行結果
代碼下載地址:點擊下載
原文鏈接:https://www.cnblogs.com/dotnet261010/p/7352541.html
相關推薦
- 2022-09-23 WPF仿LiveCharts實現餅圖的繪制_C#教程
- 2023-10-10 微信授權與拒絕授權的彈窗處理
- 2022-06-25 分享Pytest?fixture參數傳遞的幾種方式_python
- 2022-08-14 Gradle?Build?Cache引發的Task緩存編譯問題_Android
- 2022-10-25 在PyCharm中使用FMEObjects的操作步驟_python
- 2022-12-19 批處理bat腳本獲取打包發布問題記錄_DOS/BAT
- 2022-12-05 python中的單下劃線與雙下劃線以及絕對導入與相對導入_python
- 2023-01-08 react?頁面加載完成后自動執行標簽的點擊事件的兩種操作方法_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支