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多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
随机推荐
- Word/Excel 在线预览
前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...
- 让kindeditor显示高亮代码
kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: ...
- ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)
操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...
- 动手做第一个Chrome插件
Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...
- Java多态性——分派
一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...
- Unicode 和 UTF-8 有何区别?
Unicode符号范围 (一个字符两个字节) | UTF-8编码方式 (十六进制) | (二进制) —————————————————————– 这儿有四个字节从-----00 00 ...
- 热修复-Tinker
微信开源,真是喜出望外,必须要去看看啊,比起nuwa来微信好很多,而且github上也有专门的官方文档说明,还有很多资料查询 参考地址:https://github.com/Tencent/tinke ...
- 图解DevExpress RichEditControl富文本的使用,附源码及官方API
9点半了,刚写到1.2. 该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 快速构建App界面的框架(●'◡'●) -----SalutJs
前言 卤煮在公司之初接触到的是一个微信APP应用.前端技术采用的是Backbone+zepto等小型JS类库.在项目开发之初,这类中小型的项目采用这两种库可以满足基本的需求.然而,随着迭代的更新和业务 ...