03_工厂方法模式
工厂方法模式是一种创建型设计模式,用于定义一个创建对象的接口,但将实际创建对象的工作延迟到子类中。这样可以使一个类的实例化延迟到其子类中,从而实现解耦和灵活性。
在工厂方法模式中,通常包含以下几个角色:
- 抽象工厂(Creator):定义创建对象的接口,通常包含一个抽象的工厂方法,由子类实现具体的对象创建逻辑。
- 具体工厂(ConcreteCreator):实现抽象工厂接口,负责创建具体的对象。
- 抽象产品(Product):定义工厂方法创建的对象的接口。
- 具体产品(ConcreteProduct):实现抽象产品接口,是具体工厂创建的对象。
Product
public interface IFruit { /// <summary> /// 水果的数量 /// </summary> double Amount { get; } /// <summary> /// 种植 /// </summary> /// <param name="amount"></param> void Plant(int amount); /// <summary> /// 生成 /// </summary> /// <param name="days"></param> void Grow(int days); /// <summary> /// 收获 /// </summary> /// <returns></returns> double Harvest(); }
ConcreteProduct
苹果

public class Apple : IFruit { public double Amount { get; private set; } public void Grow(int days) { Amount *= days * 0.85; } public double Harvest() { return Amount; } public void Plant(int amount) { Amount = amount; } }
香蕉

public class Banana : IFruit { public double Amount { get; private set; } public void Grow(int days) { Amount *= days * 2; } public double Harvest() { return Amount; } public void Plant(int amount) { Amount = amount; } }
橘子

public class Orange : IFruit { public double Amount { get; private set; } public void Grow(int days) { Amount *= days * 1.5; } public double Harvest() { return Amount; } public void Plant(int amount) { Amount = amount; } }
Creator
public interface IFruitFactory { IFruit Create(); }
ConcreteCreator
苹果
public class AppleFactory : IFruitFactory { public IFruit Create() { return new Apple(); } }
香蕉
public class BananaFactory : IFruitFactory { public IFruit Create() { return new Banana(); } }
橘子
public class OrangeFactory : IFruitFactory { public IFruit Create() { return new Orange(); } }
internal class Client { /* 优点: (1)工厂方法模式就很好的减轻了工厂类的负担,把某一类/某一种"水果"交由一个工厂生产;(对应简单工厂的缺点1) (2)增加某一类"水果"并不需要修改工厂类,只需要添加生产这类"水果"的工厂即可,使得工厂类符合开放-封闭原则。 缺点: (1)相比简单工厂,实现略复杂。 (2)对于某些可以形成产品族的情况处理比较复杂。我们可以借用抽象工厂来实现。 */ public void Start() { DoStuff(new AppleFactory().Create()); DoStuff(new BananaFactory().Create()); DoStuff(new OrangeFactory().Create()); } private void DoStuff(IFruit fruit) { fruit.Plant(10); fruit.Grow(180); Console.WriteLine($"{fruit.GetType().Name}收获:{fruit.Harvest()}"); } }
调用
static void Main(string[] args) { new Client().Start(); Console.ReadKey(); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)