二级小兵——工厂模式(Factory Method)
前言
上一篇我们介绍了单例模式,今天给大家讲一个比较简单的模式——工厂模式(Factory Method),工厂模式又是什么呢?顾名思义,工厂——生产制造东西的地方。那么应用在程序当中该如何使用、并且又起到什么效果呢?以至于为什么用工厂模式呢?
之前我们说的OCP原则(开放封闭原则),对扩展开放,对修改封闭这一原则。在工厂模式中有极好的体现,对对象及类进行极好的封装。使其减少代码之间的耦合性。更具有扩展性。
工厂模式介绍
一、来由
在我们编程过程当中,总会面临一些类的创建以及对象的创建,但是由于需求而不断变动(增加或者修改),导致对象的变化。这时怎么处理这个问题呢?
工厂模式提供的一种封装机制,隔离出了那些易变动的对象。这个时候需求的变动不再影响之前的对象的变动了。
二、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
三、案例图

工厂模式中由以下部分组成:
(1)、抽象工厂(Creator): 复制定义工厂所需的基本规则,其他任何具体工厂都得继承此抽象工厂
(2)、具体工厂(Concrete_Creator):继承抽象工厂,实现其定义的方法,以此来创建具体的产品
(3)、抽象产品(Product):复制定义产品的基本方法及规则,所有具体产品都得基础此抽象产品类
(4)、具体产品(Concrete_Product):继承抽象产品,实现其定义抽象方法,由具体工厂创建,两者是一一对应的关系。
四、工厂模式代码实现
这里我们通过一个事例来介绍工厂模式的规则及用法。在工厂模式中,定义抽象工厂,然后其具体工厂继承实现其抽象方法调用继承了抽象产品类的具体产品来创建产品。

下面我们就手机产品的制造来看看下面的事例吧:
namespace ConsoleApp4
{
public class Factory_Method_Pattern
{
}
#region 产品 =========================
/// <summary>
/// 抽象手机产品类
/// </summary>
public abstract class Phone
{
public abstract string Create();
} /// <summary>
/// 具体华为手机产品类
/// </summary>
public class Huawei : Phone
{
/// <summary>
/// 实现抽象方法
/// </summary>
/// <returns></returns>
public override string Create()
{
return "华为一号现世";
}
} /// <summary>
/// 具体小米手机产品类
/// </summary>
public class Xiaomi : Phone
{
/// <summary>
/// 实现抽象方法
/// </summary>
/// <returns></returns>
public override string Create()
{
return "小米一号现世";
}
} #endregion #region 工厂=========================
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Factory
{
/// <summary>
/// 抽象工厂类的方法,创建调用产品
/// </summary>
/// <returns></returns>
public abstract Phone CreatePhone();
} /// <summary>
/// 具体华为工厂类,继承抽象工厂类
/// </summary>
public class HuaweiFactory : Factory
{
/// <summary>
/// 实现继承方法
/// </summary>
/// <returns></returns>
public override Phone CreatePhone()
{
return new Huawei();
}
} /// <summary>
/// 具体小米工厂类,继承抽象工厂类
/// </summary>
public class XiaomiFactory : Factory
{
/// <summary>
/// 实现继承方法
/// </summary>
/// <returns></returns>
public override Phone CreatePhone()
{
return new Xiaomi();
}
}
#endregion
}
class Program
{
static void Main(string[] args)
{
//初始化工厂
Factory huaweiFactory = new HuaweiFactory(); //生产具体的华为手机
var result=huaweiFactory.CreatePhone();
//华为手机现世
var answer = result.Create();
Console.WriteLine(answer); Factory xiaomiFactory = new XiaomiFactory();
result = xiaomiFactory.CreatePhone();
answer = result.Create();
Console.WriteLine(answer); Console.ReadLine();
}
}
在上述事例中,同样是先把手机抽象出一个抽象类,手机当然也不是凭空出现的。所以需要再抽象一个工厂类。工厂类派生子类不同的手机厂商类。同样手机也派生了不一样的品牌。手机厂商类再对应手机品牌去生产相应的手机。这时我们需要增加一个手机手机品牌,我们不需要去修改工厂类及产品类。我们另外新增即可。完全不影响其原来的运行。比如我们需要新增魅族手机。
#region 新增魅族手机 ================
/// <summary>
/// 新增魅族工厂类
/// </summary>
public class MeizuFactory : Factory
{
public override Phone CreatePhone()
{
return new Meizu();
}
} /// <summary>
/// 新增具体魅族手机产品类
/// </summary>
public class Meizu : Phone
{
public override string Create()
{
return "魅族一号现世";
}
}
#endregion
在客户端调用时增加以下调用就可以了
Factory meizuFactory = new MeizuFactory();
result = meizuFactory.CreatePhone();
answer = result.Create();
Console.WriteLine(answer);
使用场景及优缺点
在此模式中,将所有要创建的具体对象的工作都延迟放在了子类中去实现,实现了一种扩展的策略。与OCP原则相对应。
工厂模式主要针对解决的是”单个对象”的问题。隔离类的对象的使用者与具体类型之间的耦合关系。去实现了一定程度的解耦。
(一)使用场景
1、当用户不需要知道产品的类名的时候或者不关心如何创建的时候。我们只需要知道创建它的具体工厂的时候。
2、将创建对象的任务委托给多个工厂中的一个,客户端使用的时候无需关心是哪一个创建产品。当需要动态指定。
(二)优点
1、在编程方法中,客户端调用不需要知道产品的具体工厂,也不需要关心如何创建的。
2、在增加需求的时候,增加产品的时候仅需要新增一个工厂类及产品类即可,不需要对原来的代码进行修改。可轻易的扩展。
(三)缺点
在增加产品的时候,额外的增加了工厂类及产品类。增加一个产品增加两个类。在一定程度上增加了系统的复杂度。同时也增强了类之间的依赖性。这也就是其中不好的问题
总结
每一个设计模式都有对应的使用场合,切勿滥用。在我们学习设计模式的同时,我们也需要以其原主要则作为基准学习。万万不能违背原则。在设计模式——工厂模式中,将创建对象的任务委托给其工厂子类、延迟执行。解决了系统难于扩展的问题,同时也减少了具体类与对象之间的耦合性。也实现了开放扩展封闭修改的原则。
这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!
欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!

二级小兵——工厂模式(Factory Method)的更多相关文章
- c++工厂模式(Factory method)
下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式. 1.工厂的接口,相当于造人工厂总部. class IHumanFactory { public: IHumanFactory(void) { ...
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 工厂方法模式-Factory Method(Java实现)
工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- 六个创建模式之工厂方法模式(Factory Method Pattern)
问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...
- 工厂模式(Factory Patter)
1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...
随机推荐
- 不同版本2.5的Servlet web.xml 头信息
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...
- 使用nginx+tomcat实现动静分离
动态资源与静态资源的区别 微微的概括一下 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源. 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变. 什么是动静分离 动静分离 ...
- 《C# 语言学习笔记》——定义属性
属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...
- git pull 出现non-fast-forward的错误
1.git pull origin daily_liu_0909:liu_0909 出现non-fast-forward的错误,证明您的本地库跟远程库的提交记录不一致,即 你的本地库版本需要更新2.g ...
- 完美解决eclipse编辑器中文字符过小问题
window – preferences – general – appearance – colors and fonts – basic – text font – edit 把弹出页面中“西欧语 ...
- Web安全之CSRF攻击(转载)
CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...
- 【iOS】receiver type *** for instance message is a forward declaration
错误原因:没有引入相关的头文件 http://stackoverflow.com/questions/8815200/receiver-type-for-instance-message-is-a-f ...
- BrowserSync,自动刷新,解放F5,去掉更新提示
BrowserSync虽然这个技术不算新,但是依然有用.略微介绍下 没有安装node,先安装node,这里不再做介绍 安装 npm install -g browser-sync 全局安装,方便在任 ...
- C++虚函数的工作原理
静态绑定与动态绑定 讨论静态绑定与动态绑定,首先需要理解的是绑定,何为绑定?函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定. 理解了绑定后再理解静态与动态. 静态绑定:指在程序 ...
- MyBatis 核心配置综述之 ResultSetHandler
目录 ResultSetHandler 简介 ResultSetHandler 创建 ResultSetHandler 处理结果映射 DefaultResultSetHandler 源码解析 我们之前 ...