设计模式之简单工厂模式-程序员宅基地

技术标签: c#  设计模式  

设计模式是C#程序员从拖控件成长为技术大牛的必经之路,经过《Head First》洗礼后,作为一个随笔留在博客园吧。

OK,让我们进行第一任务:请朋友喝茶或者喝咖啡。

整理下我们的思路:喝茶或者喝咖啡,都要煮开水、洗杯子、冲泡茶(咖啡)。煮开水和洗杯子代码可以复用,考虑这个原则(实现代码的复用选择抽象类,实现多态性选择接口),我们选择创建一个抽象类,用来实现煮开水和洗杯子功能。

代码如下:

 1 using System;
 2 
 3 namespace SimpleDrinkFactory
 4 {
 5     abstract class BeforeDrink
 6     {
 7         //煮开水
 8         public void BoilWater()
 9         {
10             Console.WriteLine("煮开水");
11         }
12         //洗杯子
13         public void WashCup()
14         {
15             Console.WriteLine("洗杯子");
16         }
17         //冲泡(子类继承重写)
18         public abstract void Function();
19     }
20 }
BeforeDrink
 1 using System;
 2 
 3 namespace SimpleDrinkFactory
 4 {
 5     class Tea:BeforeDrink
 6     {
 7         public override void Function()
 8         {
 9             Console.WriteLine("冲泡茶叶");
10             //throw new NotImplementedException();
11         }
12     }
13 }
Tea
 1 using System;
 2 
 3 namespace SimpleDrinkFactory
 4 {
 5     class Coffee:BeforeDrink
 6     {
 7         public override void Function()
 8         {
 9             Console.WriteLine("冲泡咖啡");
10             //throw new NotImplementedException();
11         }
12     }
13 }
Coffee
 1 using System;
 2 
 3 namespace SimpleDrinkFactory
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Console.WriteLine("星期天,朋友来我家玩,我请大家和饮料。");
10             Console.WriteLine("请选择要喝的饮料:Tea or Coffee");
11             string type = Console.ReadLine();
12             BeforeDrink drink = null;
13             switch (type)
14             {
15                 case"Tea":
16                     drink=new Tea();
17                     break;
18                 case "Coffee":
19                     drink = new Coffee();
20                     break;
21                 default:
22                     Console.WriteLine("Sorry,没有您选择的饮料");
23                     break;
24             }
25             drink.BoilWater();
26             drink.WashCup();
27             drink.Function();
28             Console.WriteLine("朋友喝"+ type +"");
29             Console.WriteLine("朋友满意的走了");
30             Console.ReadKey();
31         }
32     }
33 }
Main()

执行之后应该是下图所示

过了一段时间,岳父来我家做客,点名只喝温酒。

岳父发话了,咋办,赶紧按照下面流程重新修改咱们的Drink程序呗:

1、添加alcohol类,继承于BeforeDrink,重写Function方法

2、修改Main()中的Switch方法,添加alcohol分支

OK,经过修改,岳父可以喝温酒了。但是岳母来了,点名要喝红糖水;父亲来了,点名要喝。。。

然后大家就会发现,维护起来太麻烦了,同时我们的Switch也会越来也多分支。

这个时候,终于要用到我们的工厂模式了。

看下简单工厂模式的UML图(UML不会用,见谅)

按照上述UML图写我们的代码。

Tea、Coffee、BeforeDrink类和上面一样没有变化,新增SimpleDrinkFactory类和修改Main();

 1 namespace SimpleDrinkFactory
 2 {
 3     class SimpleDrinkFactory
 4     {
 5         public static BeforeDrink CreatDrink(string type)
 6         {
 7             BeforeDrink drink = null;
 8             if (type.Equals("Tea"))
 9             {
10                 drink = new Tea();
11             }
12             else if (type.Equals("Coffee"))
13             {
14                 drink = new Coffee();
15             }
16             return drink;
17         }
18     }
19 }
SimpleDrinkFactory
 1 using System;
 2 
 3 namespace SimpleDrinkFactory
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Console.WriteLine("星期天,朋友来我家玩,我请大家和饮料。");
10             Console.WriteLine("请输入要喝的饮料:");
11             string type = Console.ReadLine();
12             BeforeDrink sdf = SimpleDrinkFactory.CreatDrink(type);
13             sdf.BoilWater();
14             sdf.WashCup();
15             sdf.Function();
16             //switch (type)
17             //{
18             //    case"Tea":
19             //        drink=new Tea();
20             //        break;
21             //    case "Coffee":
22             //        drink = new Coffee();
23             //        break;
24             //    default:
25             //        Console.WriteLine("Sorry,没有您选择的饮料");
26             //        break;
27             //}
28             //drink.BoilWater();
29             //drink.WashCup();
30             //drink.Function();
31             Console.WriteLine("朋友喝"+ type +"");
32             Console.WriteLine("朋友满意的走了");
33             Console.ReadKey();
34         }
35     }
36 }
Main()

执行之后的结果如下

从代码上看,其实变化的部分只是将Main()中的代码Copy至新增的SimpleDrinkFactory类中。

但这恰恰是面向对象设计的一个很关键的思路。(还记得封装、继承、多态么)

在以后的日记里,咱们会遇到更简单的方法,可以让我们的代码自动创建不同的实例,不用每次新增一个饮料,都要重新修改Switch或者if语句。

Ps:古语道,世界上最难的唯有两件事,一为将别人的钱财装进自己的口袋里,二为将自己的思想塞入别人的脑袋中。古人诚不欺我。

转载于:https://www.cnblogs.com/SunnyZhu/p/3826511.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34072159/article/details/94672390

智能推荐

Kafka : Kafka入门教程和JAVA客户端使用-程序员宅基地

文章浏览阅读5.4w次,点赞36次,收藏238次。目录目录Kafka简介环境介绍术语介绍消费模式下载集群安装配置命令使用JAVA实战参考文献Kafka简介由Scala和Java编写,Kafka是一种高吞吐量的分布式发布订阅消息系统.环境介绍操作系统:centos6.5 kafka:1.0.1 zookeeper:3.4.6术语介绍Broker : Kafka集群包含一个或..._kafka

使用jQuery选择和操作CSS伪元素来改变选中对象的CSS-程序员宅基地

文章浏览阅读1.5k次。DIEA您认为这将是一个简单的问题,jQuery可以做的其他事情。不幸的是,问题归结为一个技术问题:css:after和:之前规则不是DOM的一部分,因此不能使用jQuery的DOM方法进行更改。有一些方法可以使用JavaScript和/或CSS解决方法来操纵这些元素;您使用哪一个取决于您的确切要求。我将从广泛认为的“最佳”方法开始:1)添加/删除预定的类在这种方法中,您已经在CSS中创建了一个..._jquery css before

在postman一键导入swagger中的api_postman导入swagger报错-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。之前一直傻傻的复制,虽然之前看postman的相关文档知道可以和一些API控制台互通,直接获取所有的API。但是由于一直在业务功能上的测试较多,接口方面的已经调通,就没有搞这个。今天把这个事情搞了,很简单,直接导入。第一步:获取swagger地址第二步:postman导入,import提交即可最后查看..._postman导入swagger报错

FastAPI学习-7.POST请求body-多个参数_fastapi post body-程序员宅基地

文章浏览阅读991次。前言既然我们已经知道了如何使用 Path 和 Query,下面让我们来了解一下请求体声明的更高级用法。混合使用 Path、Query 和请求体参数你可以随意地混合使用 Path、Query 和请求体参数声明,FastAPI 会知道该如何处理。还可以通过将默认值设置为 None 来将请求体参数声明为可选参数:from typing import Optionalfrom fastapi import FastAPI, Pathfrom pydantic import BaseModelap_fastapi post body

【回眸】剑指offer怎么刷——剑指系列(一)-程序员宅基地

文章浏览阅读587次,点赞2次,收藏7次。最近有刷算法方面的需要,直接搜出来的学习建议和技巧都太宽泛,而且夹杂着很多广告。借助第二大脑给自己提了一些建议和计划,希望也能帮助到屏幕面前的你!_剑指offer

ceph在品高云中的实践-程序员宅基地

文章浏览阅读145次。ceph简介ceph是业界目前人气最高的开源存储项目之一,关于其定义在官网是这样的:“Ceph is a unified, distributed storage system designed for excellent performance, reliability and scalability.”翻译一下就是:Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、..._品高 纠删码

随便推点

二、svn分支策略原理:-程序员宅基地

文章浏览阅读159次。零、说明:-----欢迎拍砖1、下面内容是找的网上资料总结的,不是生产环境内容,svn分支策略好麻烦啊2、merge很重要而且不好理解,merge修改的只是本地的工作副本,所以只要不提交,不会对服务端造成影响3、多个项目互相依赖,会不会混乱,版本怎么管理那????一、Trunk,Branches,Tags说明1、Branches、Tags生成都是使用svncopy命令生成..._svn切换分支的底层原理

阿里云轻量应用服务器LAMP镜像下搭建网站_阿里云轻量服务器lamp不用域名怎么建站-程序员宅基地

文章浏览阅读915次。阿里云轻量应用服务器LAMP镜像下搭建网站1.服务器选择我配的是2GB内存1核 40GB SSD系统盘。阿里的云翼计划24岁以下自动获取学生身份,这样购买的话一个月只要9.5元。2.选择应用镜像因为部署的是php项目所以选择的是LAMP应用镜像。3.购买之后,环境都是搭配好的。剩下的就是按照步骤配置MySQL和上传文件。1.解析域名。阿里云解析域名可在此快速添加DNS解析,其他域..._阿里云轻量服务器lamp不用域名怎么建站

Makefile教程-程序员宅基地

文章浏览阅读2次。Makefile学习教程: 跟我一起写 Makefile 0 Makefile概述 0.1 关于程序的编译和链接1 Makefile 介绍 1.1 Makefile的规则1.2 一个示例1.3 make是如何工作的1.4 makefile中使用变量1.5 让make自动推导1.6 另类风格的makefile1.7 清空目标文件的规则2 Makefile 总述 2.1 Makefile里...

iframe页面嵌套问题提示X-Frame-Options问题_proxy_hide_header x-frame-options;-程序员宅基地

文章浏览阅读9.8k次。背景:有一个页面需要被嵌入到另外一个系统中发现嵌入不进去浏览器控制台提示报错:Refused to display 'http://10.45.80.3/portal/iframe.html' in a frame because it set 'X-Frame-Options' to 'sameorigin'.分析:需要嵌入的页面加了跨域的限制解决办法:..._proxy_hide_header x-frame-options;

复旦大学邱锡鹏教授团队:Transformer最新综述-程序员宅基地

文章浏览阅读2k次,点赞4次,收藏28次。PaperWeekly 原创 · 作者 |王馨月学校 |四川大学本科生研究方向|自然语言处理Transformer 在自然语言处理、计算机视觉、音频处理等许多人工智能领域都取得了..._分层transformer

重庆成人自考本科考哪几门_自考有十七门吗-程序员宅基地

文章浏览阅读449次。成人自考本科一共有12-17门左右的考试科目,分为公共课和专业课。其中公共课一般3-5门左右,考英语(二)、中国近代史纲要、马克思基本原理概论等。_自考有十七门吗

推荐文章

热门文章

相关标签