首页 > 代码库 > 简单工厂模式(SimpleFactory)

简单工厂模式(SimpleFactory)

最近在研究Java设计模式,因此把自己在学习过程中的体悟记录下来,以方便以后复习使用。

1.简单工厂的本质

  选择实现,根据语义我们知道简单工厂的重点是在选择上而不是实现上。

2.何时选用简单工厂:

  1.如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,无须了解具体实现。

  2.如果你想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个工厂可以创建很多的,不相关的对象。

3.优缺点

  优点:更好的实现了面向接口编程,并且使得各模块之间,以及与客户端之间实现了可插拔的特点。

  缺点:可能会造成客户端复杂度提高。(这种情况一般是出现在客户端传入参数用于在工厂中选择具体创建哪一个实现类对象,如果实现类多的时候可能出现的选择情况就会增加导致客户端复杂度提高)。

4.简单工厂具体实现方式如下:

(1)通过客户端传入参数来进行选择实现方式

1.简单工厂对外接口

  

package com.simplefactory.example1.interfaces;/** * 简单工厂接口 * @author admin * */public interface Api {    /**     * 简单操作     * @param s     */    public void operation(String s);}

2.简单工厂实现类A

package com.simplefactory.example1.impl;import com.simplefactory.example1.interfaces.Api;/** * 简单工厂接口的实现类A * @author admin * */public class ImplA implements Api {        @Override    public void operation(String s) {        System.out.println("ImplA s="+s);    }}

3.简单工厂实现类B

package com.simplefactory.example1.impl;import com.simplefactory.example1.interfaces.Api;/** * 简单工厂实现类B * @author admin * */public class ImplB implements Api {    @Override    public void operation(String s) {        System.out.println("ImplB s="+s);    }}

4.简单工厂类

package com.simplefactory.example1.factory;import com.simplefactory.example1.impl.ImplA;import com.simplefactory.example1.impl.ImplB;import com.simplefactory.example1.interfaces.Api;/** * 工厂类,用于创造Api对象 * @author admin * */public class Factory {    /**     * 具体的创造Api的方法     * @param condation  从外部传入选择条件     * @return 创造好的Api实现对象     */    public static Api createApi(int condation){        //应该根据某些条件去选择究竟创造哪一个实现对象        //这些条件可以是从外部传入,也可以是从其他途径获取        //如果只有一个实现,则不必传入条件                Api api=null;                //具体的条件选择        if(condation==1){            api=new ImplA();        }else if(condation==2){            api=new ImplB();        }        //返回创造好的Api实现对象        return api;    }}

5.客户端实现

package com.simplefactory.example1.client;import com.simplefactory.example1.factory.Factory;import com.simplefactory.example1.interfaces.Api;/** * 客户端类 * @author admin * */public class Client1 {        public static void main(String[] args) {        //客户端调用工厂方法,并传入选择生产的条件        //工厂就根据客户端传入的生产条件,来进行生产        //客户端不必知道工厂是如何生产的        Api api=Factory.createApi(2);        api.operation("生产牙膏");    }}

使用简单工厂模式,客户端不必了解工厂内部的实现细节,只用根据工厂提供的对外接口,传入相应参数即可,工厂内部会根据客户端传入的参数进行具体的处理,并返回一个具体的实现类对象给客户端。

(2)通过配置文件来进行选择

接口以及实现类与以上的情况相同,不同的是工厂内部的选择情况如下:

package com.simplefactory.example2.factory;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import com.simplefactory.example2.interfaces.Api;/** * 简单工厂类,该工厂类从配置文件中读取要生产的接口对象信息 * @author admin * @日期  2014-1-27 */public class Factory {    /**     * 私有化构造方法,确保外界无法直接进行实例化     */    private Factory(){            }    /**     * 静态化工厂生产方法,用于执行创造Api实现对象的方法     * 该方法从Factory.properties配置文件中读取实现类信息,     * 并创建实现类对象     * @return 创造好的Api实现对象     */    public static Api createApi(){        Properties p=new Properties();        InputStream in=null;        try{            in=Factory.class.getResourceAsStream("Factory.properties");            p.load(in);        }catch(IOException e){            System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:");            e.printStackTrace();        }finally{            try {                in.close();            } catch (IOException e) {                e.printStackTrace();            }        }        Api api=null;        try{            //利用反射技术根据配置文件中读取到的实现类的包名,创建实现类            api=(Api)Class.forName(p.getProperty("ImplClass1")).newInstance();        }catch(Exception e){            System.out.println("创基Api实现类实例的过程中出现错误,具体堆栈信息如下:");            e.printStackTrace();        }        return api;    }}

其中配置文件使用的是Properties,其内容如下:

ImplClass1=com.simplefactory.example2.Impl.ImplAImplClass2=com.simplefactory.example2.Impl.ImplB

简单工厂模式(SimpleFactory)