创建型模式篇(工厂模式Factory Pattern)
一、工厂模式(Factory Pattern)
1、定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。提供一种封装机制来隔离这个对象的变化,从而保持系统中其他依赖这个变化对象的对象,就要用到工厂模式。
2、目的:定义一个用户创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到它的子类。
3、结构图:

工厂模式:定义一个用于创建对象的接口,但是让子类决定实例化哪个类。也就是说在工厂模式中,核心的工厂类不在负责所有产品的创建,而是将具体创建工作交给它的子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不用接触哪一个产品类被实例化这种细节。
现实工作中的例子:
//设计日志记录类Log,支持记录的方法有FileLog和EventLog两种记录类型。
//不用设计模式来实现:
public class Log
{
public void WriteEvent()
{
Console.WriteLine("EventLog Success!");
}
public void WriteFile()
{
Console.WriteLine("FileLog Success!");
}
public void Write(string LogType)
{
switch(LogType.ToLower())
{
case "event":
WriteEvent();
break; case "file":
WriteFile();
break; default:
break; }
}
}
//这样程序结构显然不符合我们要求,加入要增加一种新的日志类型DataBaseLog,那么就要修改Log类,重新加入
//switch语句不断在变化,这就引起了整个应用程序的不稳定,EventLog和FileLog是两种完全不同的记录方式
//他们之前不存在必然的联系,应该把他们分别作为单独的对象来处理对待
使用工厂模式来实现:
思想是为EventLog和FileLog抽象出一个共同的父类,结构图如下:

//首先抽象一个父类Log
public abstact class Log
{
public abstract void Write();
}
//让EventLog和FileLog去继承父类,重写父类里的方法
//EventLog类
public class EventLog:Log
{
public override void Write()
{
Conosole.WriteLine("EventLog Write Success!");
}
}
//FileLog类
public class FileLog:Log
{
public override void Write()
{
Console.WriteLine("FileLog Write Success!");
}
}
//现在再有一个新的日志记录方式DataBaseLog时候,只需要增加一个DataBaseLog子类去继承父类就可以
//不用去修改EventLog和FileLog类,满足了类之间的层次关系,又很好的符合面向对象设计中的
//单一职责原则,每一个类都只负责一件具体的事情。
//但是我们并不确定客户程序去调用哪一种日志记录方式
//也许会用到下面的语句:
EventLog eventLog=new EventLog();
eventLog.Write();
//当日志记录方式从EventLog变成FileLog时候,我们就要修改程序中上面的创建对象语句。
//这样的工作量可想而知,此时就需要解耦具体的日志记录方式,就可以引入工厂模式了
//每一个日志记录的对象就是工厂所生成的产品,既然有两种记录方式,那就需要两个不同的工厂去生产。
因此声明两个不同类型的工厂类:EventFactory类和FileFactory类
//EventFactory类
public class EventFactory
{
public EventLog Create()
{
return new EventLog();
}
}
//FileFactory类
public class FileFactory
{
public FileFactory Create()
{
return new FileLog();
}
}
这两个工厂和具体的产品之间是平行的结构,并且一一对应,我们在他们两个基础上抽象出一个公用的接口:
//LogFactory类
public abstract class LogFactory
{
public abstract Log Create();
} //EventFactory类
public class EventFactory:LogFactory
{
public override EventLog Create()
{
return new EventLog();
}
}
//FileFactory类
public class FileFactory:LogFactory
{
public override FileFactory Create()
{
return new FileLog();
}
}
//这样通过工厂模式,把上面对象创建工作封装在了工厂中,达到了具体应用程序
//和具体日志记录方式对象之间的解耦
//客户端调用代码
publc class Test
{
public static void Main(string[] args)
{
LogFactory factory=new EventFactory();
Log log=factory.Create();
log.Write();
}
}
在应用程序中,Log对象创建是频繁的,要是换成另一种日志记录方式,只需要修改为:
LogFactory factory=new FileFactory()
其他任何地方都不需要修改,我们也可以说个.net的特性,避免这种不必要的修改,利用.net的反射机制来进行实现,所以就要用到配置文件了,如果我们想用哪一种日志记录方式,就在相应的配置文件中设置如下:
<appSettings>
<add key="factoryName" value="EventFactory"></add?
</appSettings>
然后客户端代码可以这样写:
//客户端调用代码
publc class Test
{
public static void Main(string[] args)
{
string strFactoryName=ConfigurationSettings.AppSettings["factoryName"];//引入配置文件
LogFactory factory;
factory=(LogFactory)Assembly.Load("FactoryMethod").CreateInstance("FactoryMethod"+strFactoryName);
Log log=factory.Create();
log.Write();
}
}
创建型模式篇(工厂模式Factory Pattern)的更多相关文章
- 创建型设计模式之工厂模式(Abstract Factory)
结构 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- PYTHON设计模式,创建型之简单工厂模式
这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...
- 创建型模式(过渡模式) 简单工厂模式(Simple Factory)
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...
- OOAD之创建型模式之工厂模式
首先我们为什么要学习设计模式呢? 1)模式从经验中总结出来的,经过证实的方案,模式只有在实际系统中经过多次验证之后才能成为模式. 2) 提高系统的可维护性, 通过使用设计模式,在系统面临升级和维护时, ...
- Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)
Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...
- php基础设计模式 注册树模式、工厂模式、单列模式
废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...
- Java设计模式—工厂方法模式&抽象工厂模式
工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...
- java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
工厂模式定义(百度百科): 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工 ...
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...
随机推荐
- 2、corosync集群初步
配置高可用集群 配置环境:两台centos7 192.168.184.141 192.168.184.142 corosync v2 + pacemaker corosync v2:vote sys ...
- HDU 3400 Line belt (三分套三分)
http://acm.split.hdu.edu.cn/showproblem.php?pid=3400 题意: 有两条带子ab和cd,在ab上的速度为p,在cd上的速度为q,在其它地方的速度为r.现 ...
- 【Python】【面向对象】
"""# [[面向对象]]#[访问限制]#如果要让内部属性不被外部访问,可加双下划线,编程私有变量.只有内部可以访问,外部不能访问.class Student(objec ...
- JAVA读取CSV文件到MySQL数据库中
maven项目pom配置: <dependency> <groupId>net.sourceforge.javacsv</groupId> <artifact ...
- 因样式冲突引起的div消失问题
工作需要,搭建一个网站的模型,简单分成三个部分,标题栏,导航栏,主界面,效果如图: 但是点击界面的任意地方,中间的div块消失了,如图所示: 调试,发现在点击界面其他地方的时候display属性有变化 ...
- var_export
var_export可以将一个数组转为一个字符串,以符合PHP的代码风格,输出者展示一个字符串的内容. 多用于展示php代码结构,调试代码. <?php // 场合多用于展示php代码结构,调试 ...
- Django与缓存
我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程: 接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> ...
- 安装Linux系统的磁盘分区
●CentOS磁盘分区 分区顺序: "/"分区(逻辑) -> "/boot"分区(主分区) -> "swap"分区(逻辑) -& ...
- Windows下tomcat启动一闪而过
1.用记事本打开tomcat/bin/setclasspath.bat 2.添加两行代码,jdk和jre的根目录,相当于直接给出JAVA_HOME和JRE_HOME路径 set JRE_HOME=D: ...
- lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)
几个脚本文件很重要! Lumerical仿真流程: 一.DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不 ...