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 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

win10 uwp 如何判断一个对象被移除

有时候需要知道某个元素是否已经被移除,在优化内存的时候,有时候无法判断一个元素是否在某个地方被引用,就需要判断对象设置空时是否被回收。 本文告诉大家一个简单的方...

701
来自专栏黑泽君的专栏

throws 与 throw

/* * 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。 * 或者说,我处理不了,我就不处理了。 * 为了解决出...

1612
来自专栏我的技术专栏

Java锁机制(一)synchronized

1614
来自专栏淡定的博客

ECMAScript 6介绍

js中并没有声明常量的关键字,在es6中,出现了可以声明常量的关键字,const

761
来自专栏水击三千

浅谈JavaScript的函数表达式(递归)

  递归函数,在前面的博客中已经简单的介绍了。递归函数是一个通过函数名称在函数内部调用自身的函数。如下: 1 function fac(num){ 2 ...

23810
来自专栏CodingToDie

Python学习(六):函数的参数

第6 章 函数的参数 Table of Contents 位置参数 默认参数 可变参数 关键字参数 命名关键字参数 参数组合 每天步履匆匆,迎接新的战场,面对未...

5596
来自专栏算法修养

pta 习题集5-6 堆栈操作合法性

假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序...

34012
来自专栏LinkedBear的个人空间

唠唠SE的集合-00——概述 原

                        由于是数组实现,在增和删的时候会牵扯到数组增容、以及拷贝元素,所以慢。

892
来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试六(15道)

【选择题】Java基础测试六(15道) 71.main方法是Java应用程序执行的入口点,关于main方法的方法头以下哪项是合法的?(B) A、public ...

3916
来自专栏cs

c++那些事儿4.0 多态

---- 相关知识点 多态: 向不同对象发送一个消息,不同的对象接收会产生不同的行为。 a.静态多态性。 函数重载,最经典就是构造函数重载...

3309

扫码关注云+社区

领取腾讯云代金券