java设计模式(二)---工厂方法模式
2普通工厂方法模式
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2.1创建接口
/**
* 发送接口
* Created by mrf on 2016/2/25.
*/
public interface Sender {
public String send();
}
2.2创建两个实现
/**
* 邮件发送
* Created by mrf on 2016/2/25.
*/
public class MailSender implements Sender {
@Override
public String send() {
System.out.println("This is emailSender!");
return "email";
}
} /**
* 短信发送
* Created by mrf on 2016/2/25.
*/
public class SmsSender implements Sender {
@Override
public String send() {
System.out.println("This is SmsSender!!");return "sms";
}
}
2.3创建工厂
/**
* 发送工厂
* Created by mrf on 2016/2/25.
*/
public class SendFactory { public Sender produce(String type){
if("email".equals(type)){
return new MailSender();
}
if ("sms".equals(type)){
return new SmsSender();
}
System.out.println("输入类型不正确!");
return null;
}
}
2.4使用测试
/** * Created by mrf on 2016/2/25 */
public class SendFactoryTest { protected long startTime;
protected long endTime; @Before
public void setUp() throws Exception {
this.startTime= System.currentTimeMillis();
System.out.println("=========开始测试===========");
} @After
public void tearDown() throws Exception {
this.endTime = System.currentTimeMillis();
System.out.println("测试用时:"+(endTime-startTime));
System.out.println("=========测试结束===========");
} @Test
public void testProduce() throws Exception {
SendFactory sendFactory = new SendFactory();
Sender sender = sendFactory.produce("email");
String send = sender.send();
assertEquals("email",send);
} }
2.5多个工厂方法模式
package com.test.java.designPattern.factory; /**
* 多个工厂模式
* <p>
* 是对普通工厂方法模式的改进。因为普通方法模式中key错误则不能正确创建对象,
* 多个工厂模式提供多个创建方法。
* </p>
* Created by mrf on 2016/2/26.
*/
public class MultiSendFacoty { public Sender produceMail(){
return new MailSender();
} public Sender produceSms(){
return new SmsSender();
}
}
测试:
package com.test.java.designPattern.factory; import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.*; /**
* Created by mrf on 2016/2/26.
*/
public class MultiSendFacotyTest {
private MultiSendFacoty facoty; @Before
public void setUp(){
facoty = new MultiSendFacoty();
} @Test
public void testProduceMail() throws Exception {
Sender sender = facoty.produceMail();
sender.send(); } @Test
public void testProduceSms() throws Exception {
Sender sender = facoty.produceSms();
sender.send();
}
}
2.6静态工厂方法模式
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
package com.test.java.designPattern.factory; import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.*; /**
* Created by mrf on 2016/2/26.
*/
public class StaticSendFacotyTest { @Test
public void testProduceMail() throws Exception {
Sender sender = StaticSendFacoty.produceMail();
sender.send();
} @Test
public void testProduceSms() throws Exception {
Sender sender = StaticSendFacoty.produceSms();
sender.send();
}
}
2.7总结:
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
java设计模式(二)---工厂方法模式的更多相关文章
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- Java设计模式 之 工厂方法模式
1. 使用设计模式的好处:可提高代码的重复性,让代码更容易被他人理解,保证代码的可靠性. 2. 工厂模式定义:就是创建一个工厂类来创建你需要的类,工厂模式包括工厂模式和抽象工厂模式,抽象工厂模式是工厂 ...
- JAVA设计模式之工厂方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- 【java】 java 设计模式(1):工厂方法模式(Factory Method)
工厂方法模式分为三种: 1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口: p ...
- Java设计模式(2)——工厂方法模式
工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ...
- java设计模式学习 ----- 工厂方法模式(Factory Method)
工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ...
- 设计模式(二)—工厂方法模式
凡是出现了大量的实例需要创建,而且具有共同的接口时,可以通过工厂方法模式进行创建. 一个接口: Sender public interface Sender{ public void sen ...
随机推荐
- OpenGL 坐标与矩阵转换
1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Transformation).做个比 ...
- WinForm发布程序方式选择
@echo offsetlocal ENABLEEXTENSIONSnet use w: \\fileserver\programif NOT ERRORLEVEL 0 goto NOTUPDPGMx ...
- storysnail的Windows串口编程笔记
storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...
- [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门
一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...
- 深入理解CSS弹性盒模型flex
× 目录 [1]版本更迭 [2]display [3]基本概念[4]伸缩容器[5]伸缩项目 前面的话 CSS3引入了一种新的布局模型——flex布局.flex是flexible box的缩写,一般称之 ...
- AngularJS快速入门指南15:API
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- MooseFS学习-概述
MFS(MooseFS)是一个容错的.网络分布式文件系统,是GFS的开源实现.它把数据分散在多个物理机上,对外展现为一个整体资源. 支持的功能 Unix的通用文件系统功能:目录树:记录POSIX文件属 ...
- (转)Hibernate事务管理
Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...
- 为什么说Java中的随机数都是伪随机数?
什么是伪随机数? 1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机. 2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机. (随机这 ...
- Thrift架构~从图中理解thrift,它事实上是一种远程过程调用
thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...