码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式 -- 工厂模式

时间:2015-08-25 23:57:49      阅读:527      评论:0      收藏:0      [点我收藏+]

标签:java设计模式   工厂模式   

项目实例

背景: 有四种WebView 因为业务逻辑的不同被划分为四种类型,分别如下:

public static final int BROWSER_TYPE_INNER = 0;
public static final int BROWSER_TYPE_SIMPLE = 1;
public static final int BROWSER_TYPE_OUTER = 2;
public static final int BROWSER_TYPE_THIRD = 3;

这四种不同类型的业务逻辑分别放在不同的Handler类,因此就会有四种Handler,为了统一接口和利于扩展,提供一个接口,这个接口为:IWebViewBusiness,然后我们为了抽出业务逻辑部分,进一步理清代码逻辑,使用一个WebViewManager类来管理。
具体的层次结构如下:

技术分享

上面的继承关系比较简单,这里不再赘述了,下面重点看一下四个Handler的管理类

public class WebViewManager implements IWebViewBusiness{
}

通过这个管理类,在构造器中来生成不同的Handler

public WebViewManager(Context context , IWebViewUI webviewUI, int browserType){
     this.mIWebViewUI = webviewUI;
     switch(browserType ){
     case BROWSER_TYPE_INNER :
          mWebViewHandler = new InnerWebViewHandler(context, mIWebViewUI);
          break;
     case BROWSER_TYPE_OUTER :
          mWebViewHandler = new OuterWebViewHandler(context, mIWebViewUI);
          break;
     case BROWSER_TYPE_SIMPLE :
          mWebViewHandler = new SimpleWebViewHandler(context, mIWebViewUI);
          break;
     case BROWSER_TYPE_THIRD :
          mWebViewHandler = new BrowserThirdHandler(context, mIWebViewUI);
          break;
    }
}

接着看一下在具体的WebViewFragment或者WebViewActivity等类似的UI类中如何去使用。

public class SuperFanliFragmentWebview extends BaseFragmentWebview {
}

在onCreate()生命周期中生成Manager实例,而这个Manager通过Type类型参数构造不同的Handler。

@Override
public void onCreate (Bundle savedInstanceState ) {
     super.onCreate(savedInstanceState );
     mWebViewManager = new WebViewManager(getActivity(), this, WebViewManager.BROWSER_TYPE_INNER );
     mWebViewManager.onCreate(savedInstanceState );

}

至此结构抽象完成,仔细看看上面的实例,是不是很像下面的普通工厂模式:

技术分享

普通工厂实例

上图简单的实例如下:

/************************************************
*                Send接口                       *
************************************************/
public interface Sender {
    public void Send();
}
/************************************************
*               Mail实现类                      *
************************************************/
public class MailSender implements Sender {
    @Override
    public void Send() {
        System.out.println("this is mailsender!");
    }
}
/************************************************
*               SMS实现类                       *
************************************************/
public class SmsSender implements Sender {

    @Override
    public void Send() {
        System.out.println("this is sms sender!");
    }
}
/************************************************
*               普通工厂类                      *
************************************************/
public class SendFactory {

    public Sender produce(String type) {
        if ("mail".equals(type)) {
            return new MailSender();
        } else if ("sms".equals(type)) {
            return new SmsSender();
        } else {
            System.out.println("请输入正确的类型!");
            return null;
        }
    }
}

测试Case

public class FactoryTest {
    public static void main(String[] args) {
        SendFactory factory = new SendFactory();
        Sender sender = factory.produce("sms");
        sender.Send();
    }
}

普通工厂小结

普通工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要扩展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

抽象工厂

技术分享
上图简单的实例如下:

/************************************************
*                Send接口                       *
************************************************/
public interface Sender {
    public void Send();
}
/************************************************
*               Mail实现类                      *
************************************************/
public class MailSender implements Sender {
    @Override
    public void Send() {
        System.out.println("this is mailsender!");
    }
}
/************************************************
*               SMS实现类                       *
************************************************/
public class SmsSender implements Sender {

    @Override
    public void Send() {
        System.out.println("this is sms sender!");
    }
}
/************************************************
*               工厂接口                        *
************************************************/
public interface Provider {
    public Sender produce();
}
/************************************************
*               Mail工厂实现类                  *
************************************************/
public class SendMailFactory implements Provider {

    @Override
    public Sender produce(){
        return new MailSender();
    }
}
/************************************************
*               SMS工厂实现类                   *
************************************************/
public class SendSmsFactory implements Provider{

    @Override
    public Sender produce() {
        return new SmsSender();
    }
}

测试Case

public class Test {
    public static void main(String[] args) {
        Provider provider = new SendMailFactory();
        Sender sender = provider.produce();
        sender.Send();
    }
}

抽象工厂小结

其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!

改造项目实例

按照上面的抽象工厂,改造扩展更好的抽象工厂如下:
先定义上面所谓的Provider接口:

public interface WebViewHandlerProvider {

    public IWebViewBusiness produce( final Context context , final IWebViewUI webviewBusiness );

}

接着定义其他几种类型的Handler的工厂类并实现这个接口:

/*****************************************************************************
*                          InnerWebView工厂实现类                            *
*****************************************************************************/
public class InnerWebViewHandlerFactory implements WebViewHandlerProvider {
    @Override
    public IWebViewBusiness produce(Context context, IWebViewUI webviewBusiness) {
        if (context == null || webviewBusiness == null ) {
            return null ;
        }

        return new InnerWebViewHandler(context, webviewBusiness);
    }
}
/*****************************************************************************
*                           OutWebView工厂实现类                             *
*****************************************************************************/
public class OutWebViewHandlerFactory implements WebViewHandlerProvider {
    @Override
    public IWebViewBusiness produce(Context context, IWebViewUI webviewBusiness) {
        if (context == null || webviewBusiness == null ) {
            return null ;
        }

        return new OuterWebViewHandler(context, webviewBusiness);
    }
}
/*****************************************************************************
*                           其他工厂实现类省略                               *
*****************************************************************************/

结构如下:
技术分享
修改完成以后,我们来看看具体该如何使用,还是回到UI类看一下:

public class SuperFanliFragmentWebview extends BaseFragmentWebview {
}

还是在onCreate()生命周期中生成Manager实例

@Override
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState );

     final WebViewHandlerProvider handlerProvider = new InnerWebViewHandlerFactory();
     mProvider = handlerProvider .produce(getActivity(), this);
     mProvider.onCreate(savedInstanceState );

}

这样就修改完成了,如果想要增加一种类型的Handler,只需要增加一个Factory,和一个具体的Handler即可,完全不用修改其他类,这个扩展性比较好。
当然如果不想这么干,也可以直接不用抽象工厂模式,直接简单粗暴好了:

@Override
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState );

    mProvider = new InnerWebViewHandler(getActivity(), this);          
    mProvider.onCreate(savedInstanceState); 
}

最后多嘴一句,如果就这样简单粗暴,和上面抽象工厂实现相比,这两种实现方式有什么区别?

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java设计模式 -- 工厂模式

标签:java设计模式   工厂模式   

原文地址:http://blog.csdn.net/linux1s1s/article/details/47984183

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!