简单工厂模式

简单工厂的定义

提供创建实例的功能,而无需关心具体实现。

简单工厂的本质

选择实现。

简单工厂的优缺点

优点
 帮助封装。客户端可以更好的面向接口编程。
 解耦。客户端不需要知道实现类。
缺点
 需要理解参数的意义,增加复杂度。
 不方便扩展子类。

简单工厂的使用场景

想要隔离具体实现,让客户端只通过接口操作。
想要把创建对象的职责集中管理和控制。

示例1 根据参数选择

不足: 需要明白参数的意义,选择对应的实例。

public interface Api {
    void operation();
}
public class ApiImplA implements Api {
    @Override
    public void operation() {
        System.out.println("operation A");
    }
}
public class ApiImplB implements Api {
    @Override
    public void operation() {
        System.out.println("operation B");
    }
}
public class Factory {

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

}
public class TestClient {
    public static void main(String[] args) {
        Api api = Factory.createApi(1);
        api.operation();
    }
}

示例2 读取配置文件

SimpleFactory.properties

ImplClass=org.baozi.sf.ApiImplB
public interface Api {
    void operation();
}
public class ApiImplA implements Api {
    @Override
    public void operation() {
        System.out.println("operation A");
    }
}
public class ApiImplB implements Api {
    @Override
    public void operation() {
        System.out.println("operation B");
    }
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Factory {

    public static Api createApi() {

        //加载Properties文件
        Properties properties = new Properties();
        try(InputStream in = new FileInputStream(new File("/Users/baozi/dev/workspace-idea-private/gof/src/main/resources/SimpleFactory.properties"))){
            properties.load(in);
        } catch (IOException e) {
            System.out.println("加载配置文件出错");
            e.printStackTrace();
        }

        //使用反射创建对象
        Api api = null;
        try {
            api = (Api) Class.forName(properties.getProperty("ImplClass")).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return api;
    }

}
public class TestClient {
    public static void main(String[] args) {
        Api api = Factory.createApi();
        api.operation();
    }
}

你可能感兴趣的:(简单工厂模式)