Java设计模式---简单工厂

来源:互联网 发布:java jar 运行war包 编辑:程序博客网 时间:2024/05/26 02:55

转载自 :

原文作者: 泛型

原文地址: http://my.eoe.cn/flyhigher/archive/18225.html


先看一段书中的代码,类似的代码相信很多人、包括我都写过。因为作为初学者,对于接口的使用一般都会这样写。

 1 2 3 4 5 6 7 8 91011121314151617181920212223
/***一个接口、简单定义一个方法test(String str),输出给定   的字符串*/public interface Api {    public void test(String str);}/***实现类,对接口Api的实现*/public class Impl implements Api {    public void test(String str) {//实现方法test        System.out.println("Now In Impl. The                input str == " + str);    }}//客户端public class Client {    public static void main(String[] args) {        Api api = new Impl();        api.test("........");       }}

针对接口的调用,基本上所有人都这样写过: Api api = new Impl();,这样写完全没有语法错误,但是却背离的接口调用的出发点和思想。因为Impl作为具体的实现类,暴露给了客户端,客户端知道了功能的具体实现者是实现类Impl,这就破坏了“封装隔离”。

出于调用的需要,允许客户端知道接口,但不允许其知道接口的具体实现类,如何做到,可以给要调用的接口加层“外套”,外套内是要隐藏的细节,外套外是客户端,两者通过外套隔离。

1
打个比方:将一间只有一扇门,没有窗户的房子作为一个工厂车间,它与外界的唯一通道就那扇门。外界不知道车间如何生产产品,但可以通过那扇门取得产品并使用。回到设计模式中,“门”就是我们说的接口,“产品”就是接口定义而由实现类实现的方法,“房子”也就是车间,就是将外部调用与内部实现隔离开的隔离体。这就是简单工厂的思想。

定义: 提供一个创建对象实例功能但不需关心具体实现的类,返回创建类的接口,客户端通过该类得到返回的接口,进而可以调用接口的方法。(这个解释不够抽象,感觉是代码级别的,理解有待加深)

下面是简单工厂模式的示例代码:

 1 2 3 4 5 6 7 8 91011121314151617181920212223242526
//接口的定义 public interface Api {    public void operation(String s);}//接口的实现public class Impl inplements Api {    public void operation(String s) {        System.out.println("s == " + s);    }}//工厂类 创建Api对象,包装创建细节,返回Api对象public class Factory {    public static Api createApi() {        Api api = null;        api = new Impl();//与前一段代码相同        return api;//返回创建的Api对象    }}//客户端public class Client {    public static void main(String args[]) {        Api api = Factory.createApi();//通过工厂类获得Api对象,但并不知道接口Api的具体实现是由Impl类完成的//隐藏了实现的细节        api.operation("简单工厂");    }}

在工厂类Factory中,通过实现类Impl实现Api接口,并返回得到的Api对象,对于客户端,想要使用operation()方法,只需要通过Factory类得到一个Api对象即可,对于接口Api的具体实现,是完全被隐藏的,这就将客户客户端的调用与接口的具体实现隔离开。达到封装隔离的目的。
上面的示例是只有一个实现类的简单示例,目的只是阐述简单工厂模式的思想,并未涉及简单工厂中其他知识。


原创粉丝点击