網站首頁 編程語言 正文
場景:簡單工廠時候,我設計了一個場景,有三種劍去打怪,這時候,需求變化了,我三種劍變成了,匕首、劍以及木棒,想要用工廠方法來實現,怎么弄?
1.上文講過簡單工廠模式,它的最大優點在于工廠類內有創建類型的判斷邏輯,客戶端只需要通過動態的選擇想要創建的類型,就可以交給工廠類來創建,去除了客戶與具體產品之間的依賴。
缺點在于,當新建一個類型的時候,需要修正工廠類中的判斷邏輯,添加一個case,此時就違背了開放-封閉原則。
2.工廠方法模式的引入:定義一個用于創建對象的接口,讓子類覺得實例化哪一個類,工廠方法模式使得一個類的實例化延遲到了它的子類。
客戶端再使用工廠方法模式的時候,需要決定實例化哪一種工廠,選擇判斷的問題依然存在,也就是說工廠方法模式是對簡單工廠的改進,把判斷邏輯移動到了客戶端。當加入新功能時候,原來是要修正工廠類,現在修改客戶端就行了。
領悟:例如在進行編寫一個計算器的時候。
- ①如果把所有的判斷邏輯和類的創建放在一個類中,那么出現的問題是,新增加一個功能,其他的功能也會收到影響。所以引進了簡單工廠模式,使得耦合性降低了。
- ②簡單工廠在添加新功能的時候,需要改工廠類,同樣違背開放-封閉原則,對更改是關閉的,對擴展是開放的。
- ③針對簡單工廠又出現了工廠方法,這時候將工廠類進一步抽象為多個工廠類。這時候我添加一個新功能,就需要添加一個新的工廠類和一個具體的功能類。工作量也變大了。
Product:抽象產品
ConcreteProduct:具體產品
Factory:抽象工廠
ConcreteFactory:具體工廠
3.代碼實現:
Weapon.cs
namespace FactoryMethod
{
public class Weapon
{
//設計一個怪獸,血量是100(其實并不是很合適,怪獸應該單獨設計
//作為beat方法的參數傳入
protected int monsterLife = 100;
public virtual void beat()
{
}
}
}
Knife.cs
namespace FactoryMethod
{
public class Knife : Weapon
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 20;
Console.WriteLine("The Monster is still alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}
Sword.cs
namespace FactoryMethod
{
public class Sword:Weapon
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 50;
Console.WriteLine("The Monster is still alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}
Stick.cs
namespace FactoryMethod
{
public class Stick:Weapon
{
public override void beat()
{
while (monsterLife > 0)
{
base.monsterLife -= 100;
Console.WriteLine("The Monster is still alive!");
}
Console.WriteLine("Excellent!The Monster is dead!");
}
}
}
IWeaponFactory.cs
namespace FactoryMethod
{
public interface IWeaponFactory
{
Weapon CreateWeapon();
}
}
KnifeFactory.cs
namespace FactoryMethod
{
public class KnifeFactory:IWeaponFactory
{
public Weapon CreateWeapon()
{
return new Knife();
}
}
}
SwordFactory.cs
namespace FactoryMethod
{
public class SwordFactory : IWeaponFactory
{
public Weapon CreateWeapon()
{
return new Sword();
}
}
}
StickFactory.cs
namespace FactoryMethod
{
public class StickFactory:IWeaponFactory
{
public Weapon CreateWeapon()
{
return new Stick();
}
}
}
Program.cs
namespace FactoryMethod
{
class Program
{
static void Main(string[] args)
{
IWeaponFactory factory = new SwordFactory();
Weapon weapon = factory.CreateWeapon();
weapon.beat();
factory = new KnifeFactory();
weapon = factory.CreateWeapon();
weapon.beat();
factory = new StickFactory();
weapon = factory.CreateWeapon();
weapon.beat();
Console.ReadKey();
}
}
}
運行結果:
原文鏈接:https://www.cnblogs.com/dcz2015/p/5287347.html
相關推薦
- 2023-07-14 431報錯和解決方法
- 2022-11-16 python3中requests庫重定向獲取URL_python
- 2022-01-17 git git版本回退 回滾 解決方案
- 2022-09-10 PyCharm:method?may?be?static問題及解決_python
- 2021-12-16 詳細講解HTTP協議工作方式_相關技巧
- 2022-08-15 Kotlin+buildSrc更好的管理Gradle依賴譯文_Android
- 2022-04-15 ASP.NET?Core托管模型CreateDefaultBuilder()方法_基礎應用
- 2022-05-17 使用@async 注解,導致訪問RequestContextHolder獲取request為空
- 最近更新
-
- 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同步修改后的遠程分支