(3).工厂方法模式

news/2025/3/15 19:12:56/文章来源:https://www.cnblogs.com/kitthe/p/18774064

我们接上一个模式的实例:

 

(1).创建水果接口 IFruit:

 1 namespace 工厂方法模式
 2 {
 3     public interface IFruit
 4     {
 5         /// <summary>
 6         /// 水果的单价
 7         /// </summary>
 8         double Amount { get; }
 9 
10 
11         /// <summary>
12         /// 种的数量
13         /// </summary>
14         /// <param name="amount"></param>
15         void Plant(int amount);
16 
17         /// <summary>
18         /// 生成
19         /// </summary>
20         /// <param name="days"></param>
21         void Grow(int days);
22 
23         /// <summary>
24          ///收获
25         /// </summary>
26         /// <returns></returns>
27         double Harvest () ;
28     }
29 }
View Code

(2).创建工厂接口 IFruitFactory:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂方法模式.Interface
 8 {
 9     public interface IFruitFactory
10     {
11         IFruit Create();
12 
13     }
14 }
View Code

(3).创建水果的实例 Apple

 1 namespace 工厂方法模式
 2 {
 3     public class Apple : IFruit
 4     {
 5         public double Amount { get; set; }
 6 
 7         public void Grow(int days)
 8         {
 9             Amount *= days * 0.65;
10         }
11 
12         public double Harvest()
13         {
14             return Amount;
15         }
16 
17         public void Plant(int amount)
18         {
19             Amount = amount;
20         }
21     }
22 }
View Code

(4).创建水果的实例 Banana

 1 namespace 工厂方法模式
 2 {
 3     public class Banana : IFruit
 4     {
 5         public double Amount { get; set; }
 6 
 7         public void Grow(int days)
 8         {
 9             Amount *= days * 1.2;
10         }
11 
12         public double Harvest()
13         {
14             return Amount;
15         }
16 
17         public void Plant(int amount)
18         {
19             Amount = amount;
20         }
21     }
22 }
View Code

(5).创建水果的实例 Orange

 1 namespace 工厂方法模式
 2 {
 3     public class Orange : IFruit
 4     {
 5         public double Amount { get; set; }
 6 
 7         public void Grow(int days)
 8         {
 9             Amount *= days * 0.85;
10         }
11 
12         public double Harvest()
13         {
14             return Amount;
15         }
16 
17         public void Plant(int amount)
18         {
19             Amount = amount;
20         }
21     }
22 }
View Code

(6).创建水果工厂的实例 AppleFactory

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using 工厂方法模式.Interface;
 7 
 8 namespace 工厂方法模式.Models
 9 {
10     public class AppleFactory : IFruitFactory
11     {
12         public IFruit Create()
13         {
14             return new Apple();
15         }
16     }
17 }
View Code

(7).创建水果工厂的实例 BananaFactory

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using 工厂方法模式.Interface;
 7 
 8 namespace 工厂方法模式.Models
 9 {
10     public class BananaFactory : IFruitFactory
11     {
12         public IFruit Create()
13         {
14             return new Banana();
15         }
16     }
17 }
View Code

(8).创建水果工厂的实例 OrangeFactory

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using 工厂方法模式.Interface;
 7 
 8 namespace 工厂方法模式.Models
 9 {
10     public class OrangeFactory : IFruitFactory
11     {
12         public IFruit Create()
13         {
14             return new Orange();
15         }
16     }
17 }
View Code

(9).创建使用类:Client

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using 工厂方法模式.Models;
 7 
 8 namespace 工厂方法模式
 9 {
10     public class Client
11     {
12         public void Start()
13         {
14             Dostuff(new AppleFactory().Create());
15             Dostuff(new BananaFactory().Create());
16             Dostuff(new OrangeFactory().Create());
17             ///如果我们要新加一种水果,则只用新加一个水果,再加一个工厂不用动之前的代码,符合开闭原则
18 
19             Dostuff(new NewFruitFactory().Create());
20 
21         }
22 
23         public void Dostuff(IFruit fruit) 
24         {
25             fruit.Plant(10);
26             fruit.Grow(180);
27             Console.WriteLine($"柑橘收获: {fruit.Harvest()}");
28         }
29     }
30 }
View Code

(10).调用:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂方法模式
 8 {
 9     internal class Program
10     {
11         static void Main(string[] args)
12         {
13             new Client().Start();
14             Console.ReadLine(); 
15         }
16     }
17 }
View Code

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899333.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nestjs Provider

Nest 实现了 IoC 容器,会从入口模块开始扫描,分析 Module 之间的引用关系,对象之间的依赖关系,自动把 provider 注入到目标对象以上部分只是简写{provide: AppService,useClass: AppService }两种注入方式构造器注入属性注入全局模块一般来说,我们都是在需要导出的模块的m…

FastAPI+CrewAI+MySQL+Celery实现AI Agent复杂工作流

FastAPI+CrewAI+MySQL+Celery实现AI Agent复杂工作流 https://github.com/fanqingsong/CrewAIFlowsFullStack本项目主要实现使用FastAPI后端框架+CrewAI实现AI Agent复杂工作流。代码实现CrewAI的Flows功能,并支持Flow运行中间结果进行持久化存储和查询(MySQL),支持多Flow并行…

石家庄地铁收费app

先建立一个项目,项目结构如图所示先编写app页面activity_main.xml,包括其输入框和按钮<TextViewandroid:id="@+id/tvStartStation"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="起点站&quo…

[WSNesting 设置说明] 数控钻加工限制-不使用加工限制-自动连线

版权声明本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者 BensonLaur 和本文原始地址:

Git更新子模块

1.问题 如图,我们从GitHub上克隆下来一个库,内部还有类似这种右边蓝色S的表示的是该工程的子模块部分,一般初始为空,导致错误2.解决 我们需要用git submodule update --recursive --remote命令去更新初始化我们的子模块

pycharm2024下载安装一键激活2099年

​软件包和激活工具下载地址,关地球号:QStockView,发送pycharm,立刻发给你,全免费; 激活之后如下: 激活方式,打开压缩包,然后找到下面的文件,双击打开提示成功,之后,就可以了;去重新打开pycharm,就可以了; 中文设置如下: 添加图片注释,不超过 140 字(可选…

日期问题中的格式控制

define _CRT_SECURE_NO_WARNINGS include <stdio.h> include <string.h> using namespace std; void NextDay(int &year, int &month, int &day) { //存储一下月份和天数的关系 int dayOfMonth[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int is…

Windows管理小工具

Windows 管理小工具 概述 Windows 管理小工具 是一个基于批处理脚本的多功能工具,旨在帮助用户快速管理 Windows 系统中的常见设置和功能。通过简单的菜单操作,用户可以轻松完成 Windows 11 右键菜单管理、桌面图标小箭头管理、卸载 Windows 11 小组件、安装 Office、激活 Wi…

2025.3.11 php登录,连接数据库

1,$GET和$POST的区别 2, 3, 4, 5,HTML不能直接从编辑器上打开

Vue2学习5-v-model原理、表单类组件封装及v-model简化、.sync修饰符 、ref和$refs、$nextTick、自定义指令(全局、局部)、插槽(默认、具名)及商品列表案例

Vue2 v-model原理 v-model本质就是一个语法糖(一种编程语言的语法特性,允许以更简洁、易读的方式表达某些操作) 例如在输入框中,是value属性和input事件的合并 作用:实现数据的双向绑定数据变,视图跟着变视图变,数据跟着变例: $event可以获取事件的形参 <template&g…

Vue2学习5-

Vue2 v-model原理 v-model本质就是一个语法糖(一种编程语言的语法特性,允许以更简洁、易读的方式表达某些操作) 例如在输入框中,是value属性和input事件的合并 作用:实现数据的双向绑定数据变,视图跟着变视图变,数据跟着变例: $event可以获取事件的形参 <template&g…

C# 23种计模式

以下是23种设计模式: