您的位置:首页 > 其它

设计模式之一--简单工厂设计模式(SimpleFactory)

2012-12-28 23:59 441 查看
简单工厂设计模式

JAVA的的面向接口编程是一种非常重要的设计思想.

通常接口设计思路



                   

实例代码:
/*
    接口(通用,抽象,非具体功能)

*/
public interface Api {
    //一组接口定义
    public void test1(String s);
}

/*
    对接口的实现类

*/
public class Impl implements Api {
    public void test1(String s) {
        sysout("我实现了Api的接口,S=" + s);

    }

}
/*
    客户端,接口调用代码

*/
public class Client {
    public static void main(String[] args) {
        Api api = new Impl();

        api.test1("我是传给s参数的字符串");

    }

}
通常我们在学习接口的时候,就是这么学的也是这么用的,但是这样存在一个小的弊端
请看这句话,Api api = new Impl();
接口的思想就是"封装隔离",而实现类Impl应该是被接口Api封装的,并且与客户端进行隔离,也就是说客户端根本就不应该知道
Impl是具体Api的实现类,如何才能更高的设计解决方案呢?答案就是使用"简单工厂设计模式"

简单工厂定义
    定义:提供一个创建对象实例的功能,而无需关心具体实现.被创建实例类型可以是接口,抽象类,也可以是具体类

                   


    

Api:定义客户所需要的接口
Impl:具体实现Api接口的实现类,可能会有多个,如:ImplA,ImplB
Factory:工厂类,负责创建具体实现Api接口对象
Client:客户端,通过Factory类来获取对象接口,然后面向Api接口编程

工厂方法实例代码:

/*
    接口定义,接口可以通过工厂方法来创建

*/
public interface Api {
    public void operation(String s);

}

/*
    接口的具体实现类A

*/
public class ImplA implements Api {
    public void operation(String s) {
        sysout("ImplA S = " + s);

    }
}

/*
    接口的具体实现类B

*/
public class ImplB implements Api {
    public void operation(String s) {
        sysout("ImplB S = " + s);

    }
}

/*
    工厂类,用来创建Api对象

*/
public class Factory {
    public static Api createApi(int condition) {
        //根据传入的condition条件,选择究竟创建那一个具体的实现类的对象

        Api api = null;

        if(condition == 1) {
            api = new ImplA();

        } else if( condition == 2) {
            api = new ImplB();
        }

        return api;

    }

}

/*
    客户端,使用Api接口

*/
public class Client {
    public static void main(String[] args) {
        Api api = Factory.createApi(1);

        api. operation("正在使用工厂方法,创建对象");
    }

}

简单工厂--通常是用来创建一个接口,抽象类或具体类的实例
静态工厂--使用工厂时,通常是不用创建工厂的对象,可以将工厂定义为一个工具类,直接使用静态方法就可以了,为了防止客户端创建工厂实例,可以将构造函数私有化
万能工厂--一个工厂理论上可以创造任何对象,只要根据不同的接口提供不能的创建实例的方法即可
工厂范围--虽然理论上来讲,工厂可以创建任何对象,但是通常建议定义在一个组件或一个模块的级别
工厂命名--类名建议为"模块名称+Factory",比如:用户模块工厂UserFactory,方法名称通常是get+接口名称或create+接口名称
    工厂方法的执行示意图

   


工厂方法的本质
    
        选择实现    

 何时选用简单工厂

如果想完全封装具体实现,让外部只能通过接口来操作封装体,那么可以选择简单工厂,让客户端通过工厂来获取相应接口,而无需关心具体的实现.
如果想把对外创建对象的职责集中管理和控制,那么选择简单工厂,一个简单的工厂可以创建很多的,不相关的对象,可以把对外创建对象的职责集中到一个简单的工厂来,从而实现集中管理和控制.
示例代码

/*
 * 定义一组功能接口
 */
public interface InterfaceApi {
public void apiA();
public void apiB();
}

-------------------------------------------------------------------------------------

/*
 * 实现接口的功能类A
 */
public class ApiImplA implements InterfaceApi {

@Override
public void apiA() {
System.out.println("我是类ApiImplA,我实现了Api接口的apiA方法");
}

@Override
public void apiB() {
System.out.println("我是类ApiImplA,我实现了Api接口的apiB方法");
}
}

-------------------------------------------------------------------------------------

/*
 * 实现接口的功能类B
 */
public class ApiImplB implements InterfaceApi {

@Override
public void apiA() {
System.out.println("我是类ApiImplB,我实现了Api接口的apiA方法");
}

@Override
public void apiB() {
System.out.println("我是类ApiImplB,我实现了Api接口的apiB方法");
}
}

-------------------------------------------------------------------------------------

/*
 * 工厂模式,根据参数,返回对应的具体实现类
 */
public class SimpleFactory {

public static InterfaceApi createApi(int i) {
InterfaceApi api = null;
if (i == 1) {
api = new ApiImplA();
} else {
api = new ApiImplB();
}
return api;
}
}

-------------------------------------------------------------------------------------

public class Clinet {
public static void main(String[] args) {
// 通过简单工厂模式,返回对应的实现类对象
InterfaceApi api = SimpleFactory.createApi(2);
api.apiA();
api.apiB();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: