简单工厂模式

来源:互联网 发布:竹筒捕鱼原理 知乎 编辑:程序博客网 时间:2024/04/29 03:21
简单工厂设计模式

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();
}
}

0 0
原创粉丝点击