提供一个创建对象实例的功能,而无需关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。
将要创建的类:
Api:定义客户所需要的功能接口。
Impl:具体实现Api的实现类。
Impl2:具体实现Api的实现类。
Factory:工厂,选择合适的实现类,来创建Api接口对象。
Client:客户端,通过Factory来回去Api接口对象,然后面向Api接口编程。
/** * 接口的定义,该接口可以通过简单工厂来创建 */ public interface Api { void test(String s); }
public class Impl implements Api{ @Override public void test(String s) { // 实现功能的代码 System.out.println("Impl s= " + s); } }
public class Impl2 implements Api{ @Override public void test(String s) { System.out.println("Impl2 s= " + s); } }
/** * 工厂类,用来创建Api对象 */ @Slf4j public class Factory { // 方式1 // public static Api createApi(Integer type) { // Api api = null; // if (type == 1) { // return new Impl(); // } else if (type == 2) { // return new Impl2(); // } // return api; // } public static Api createApi(Class cla) { Api api = null; try { api = (Api) cla.newInstance(); } catch (Exception e){ log.info("Exception:", e); } return api; } }
/** * 客户端 */ public class Client { // 方式1 // public static void main(String[] args) { // Api api = Factory.createApi(2); // api.test1("正在使用简单工厂"); // } public static void main(String[] args) { Api api = Factory.createApi(Impl2.class); api.test("正在使用简单工厂"); } }
帮助封装:简单工厂虽然很简单,但是非常友好地帮助我们实现了组建的封装,让组建外部能真正的面向接口编程
解耦:通过简单功能,实现了客户端和具体实现类的解耦
可能增加客户端的负责度
不方便扩展子工厂
如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,可以选择简单工厂。
如果想要把对外创建对象的职责集中管理和控制,可以选择简单工厂。