java设计模式(二)---工厂方法模式

2普通工厂方法模式

就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

2.1创建接口

1 /**
2  * 发送接口
3  * Created by mrf on 2016/2/25.
4  */
5 public interface Sender {
6     public String send();
7 }

2.2创建两个实现

 1 /**
 2  * 邮件发送
 3  * Created by mrf on 2016/2/25.
 4  */
 5 public class MailSender implements Sender {
 6     @Override
 7     public String send() {
 8         System.out.println("This is emailSender!");
       return "email";
 9     }
10 }
11 
12 /**
13  * 短信发送
14  * Created by mrf on 2016/2/25.
15  */
16 public class SmsSender implements Sender {
17     @Override
18     public String send() {
19         System.out.println("This is SmsSender!!");return "sms";
20     }
21 }

2.3创建工厂

 1 /**
 2  * 发送工厂
 3  * Created by mrf on 2016/2/25.
 4  */
 5 public class SendFactory {
 6 
 7     public Sender produce(String type){
 8         if("email".equals(type)){
 9             return new MailSender();
10         }
11         if ("sms".equals(type)){
12             return new SmsSender();
13         }
14         System.out.println("输入类型不正确!");
15         return null;
16     }
17 }

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总结:

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小勇DW3

使用JAVA反射技术实现代码零耦合与功能无限扩展!

  最近在做一个功能,就是实现邮件发送功能,但是邮件发送有不同的内容和数据格式,在开始设计的时候直接将发送的内容写在了发送模块中,后来发现功能增加后,无法继续在...

862
来自专栏java学习

面试题66(StringBuffer)

面试例题1:对于如下代码,以下哪一个结论是正确的? public class Foo { public static void main(String[] ...

2664
来自专栏机器学习入门

POJ 刷题系列:1068. Parencodings

题意: 给出一组P-Sequence,每个数代表当前右括号之前的所有左括号数,求W-Sequence,表示当前右括号与它对应的左括号之间的左括号数。还是看例子...

1775
来自专栏互联网杂技

今天由我亲自给大家总结

javascript内置对象有哪些? reg正则,booer,math,string,arr,obj,number,date,function,window全...

3228
来自专栏我是攻城师

关于Java里面的字符串拼接,你了解多少?

字符串拼接是我们日常开发中很常见的操作,虽然常见,但要是使用不当的的话,很有可能让你的程序处理效率降低一大半,所以我们有必要来重新了解一下Java里面的字符串操...

1343
来自专栏java 成神之路

java 序列化 原理解析

3068
来自专栏老马说编程

(84) 反射 / 计算机程序的思维逻辑

上节介绍完了并发,从本节开始,我们来探讨Java中的一些动态特性,包括反射、类加载器、注解和动态代理等。利用这些特性,可以以优雅的方式实现一些灵活和通用的功能,...

2208
来自专栏Ryan Miao

从国家统计局爬下来的地区信息

发现地区编码网上流传了很多版本。有很多崇文区,玄武区之类的。于是想了想,还是自己做一份。不敢保证没问题,但还没遇到问题。 首先,从网上找到一个大神写的jsoup...

3126
来自专栏菩提树下的杨过

scala 学习笔记(01) 函数定义、分支、循环、异常处理、递归

package yjmyzz import scala.io.StdIn object ScalaApp { def main(args: Array...

1839
来自专栏向治洪

java基础之反射

Contents java基础巩固笔记(1)-反射 反射 反射基本使用 数组的反射 配置文件加载 内省(Instropector) & JavaBean ...

1806

扫码关注云+社区