23种设计模式--工厂模式-Factory Pattern
一、工厂模式的介绍
工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式;先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简单工厂里面的工厂,但是这样的我们想吃什么水果只能看水果店有没有,没有就吃不到,后来人们又想出了一个办法那就是开来了水果园,你想吃什么我就种什么,这样就满足吃一切水果的想法,这也就是所说的工厂模式--下面又我们由普通-简单工厂-工厂模式-最后来个抽象工厂--不过抽象工厂等下篇再谈;
二、工厂模式Demo
无模式下的吃水果
/// <summary>
/// 水果类
/// </summary>
public abstract class Fruit
{
public abstract void Eat();
}
public class Apple : Fruit
{
public override void Eat()
{
Console.WriteLine("我吃苹果");
}
}
public class Orange : Fruit
{
public override void Eat()
{
Console.WriteLine("我吃橘子");
}
}
static void Main(string[] args)
{
//当出现直接new的时候我们就应该考虑是否使用工厂模式
//这里违反oo的原则,我们需要将改变的封装起来
//当然下一步我们先进行简单工厂的例子
Fruit fruit = new Apple();
fruit.Eat();
Fruit fruit2 = new Orange();
fruit2.Eat();
Console.ReadKey();
}
简单工厂模式下的吃水果
水果类在这就贴出来了,和上面的情况一样,主要贴出来简单工厂这一块的,这一块我使用了一个枚举,来表示不同的类型
public enum FruitEnum
{
Apple=1,
Orange=2
}
/// <summary>
/// 创建具体实例的简单工厂
/// 当然明智的大家又会发现下面也都new,假如说我们增加一个类的情况下又要修改代码,好吧我们这么懒惰这不是我们干的事,那就引出我们下一位优秀的设计师那就是工厂设计师;
/// </summary>
public class SimpleFactoryFruit
{
public static Fruit CreateFactory(FruitEnum friutEnum)
{
switch (friutEnum)
{
case FruitEnum.Apple:
return new Apple();
case FruitEnum.Orange:
return new Orange();
default:
throw new Exception("暂时没有你想吃的水果");
}
}
}
static void Main(string[] args)
{
//简单工厂将变化的水果封装到工厂里面使用不同的类型创建不同的对象将我们对水果的依赖变成间接的,使得对象之间的耦合度降低,但是创建对象的工厂里面,每增加一种水果就需要增加一种判断,这就是简单工厂的缺点;
Fruit fruit = SimpleFactoryFruit.CreateFactory(FruitEnum.Apple);
fruit.Eat();
Fruit fruit2 = SimpleFactoryFruit.CreateFactory(FruitEnum.Orange);
fruit2.Eat();
Console.ReadKey();
}
工厂模式下的吃水果
还是一样水果类不进行贴出来,下面就要关键是创建工厂这一类,
//抽象出创建水果的工厂类,将创建真正实例的推到子类上
//这样就不存在简单工厂的缺点,每次只需要子类增加就可以不需要在原来代码上做更改
public abstract class CreateFruitFactory
{
public abstract Fruit CreateFruit();
}
public class CreateAppleFactory : CreateFruitFactory
{
public override Fruit CreateFruit()
{
return new Apple();
}
}
public class CreateOrangeFruit : CreateFruitFactory
{
public override Fruit CreateFruit()
{
return new Orange();
}
}
//工厂模式解决了简单工厂模式需要更改代码的问题
//是不是这样就结束了尼,我们的程序的扩展性也好了各种都好了那还需要更改什么尼,假如我们又增加一种水果罐头,这样我们工厂模式就不适用了,那么又该怎么养去设计尼,接下来请听下回分解--抽象工厂
CreateFruitFactory createApple = new CreateAppleFactory();
Fruit apple = createApple.CreateFruit();
apple.Eat();
CreateFruitFactory createOrage = new CreateOrangeFruit();
Fruit orange = createOrage.CreateFruit();
orange.Eat();
Console.ReadKey();
三、GitHub
https://github.com/wangtongzhou520/Designpattern
23种设计模式--工厂模式-Factory Pattern的更多相关文章
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- 【设计模式】工厂模式 Factory Pattern
1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...
- 设计模式 - 出厂模式(factory pattern) 详细说明
出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- JAVA设计模式之工厂模式—Factory Pattern
1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- [设计模式]工厂模式factory
参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
随机推荐
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- .NET Core 首例 Office 开源跨平台组件(NPOI Core)
前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- 安装eclipse的maven插件
我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...
- DBA成长路线
从开发转为数据库管理,即人们称为DBA的已经有好几年,有了与当初不一样的体会.数据是企业的血液,数据是石油,数据是一切大数据.云计算的基础.作为DBA是数据的保卫者.管理者,是企业非常重要的角色.对于 ...
- 【项目管理】GitHub使用操作指南
GitHub使用操作指南 作者:白宁超 2016年10月5日18:51:03> 摘要:GitHub的是版本控制和协作代码托管平台,它可以让你和其他人的项目从任何地方合作.相对于CVS和SVN的联 ...