简单工厂的定义:提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类。类图如下:
抽象产品角色:
所有产品的父类或是所有产品工有的接口。
1 //定义接口 此处也可以是个抽象类 2 public interface Api{ 3 //公共接口方法 4 public void operation(); 5 }
具体产品角色:
继承或实现抽象产品角色。
给出两个实现方式:
1 //实现接口方式A 2 public class ImplA implements Api{ 3 @Override 4 public void operation() { 5 //实现方式A代码 6 } 7 }
1 //实现接口方式B 2 public class ImplB implements Api{ 3 @Override 4 public void operation() { 5 //实现方式B代码 6 } 7 }
工厂类角色:
简单工厂模式核心,负责制造具体产品。
这里使用静态方法:
1 public class Factory{ 2 /** 3 * 创建具体对象 4 * @param type 类型标识 5 */ 6 public static Api createApi(String type){ 7 Api api = null; 8 switch(type){ 9 case "A": 10 api = new ImplA(); 11 break; 12 case "B": 13 api = new ImplB(); 14 break; 15 //更多实现方式 16 ... 17 } 18 return api; 19 } 20 }
客户端代码:
1 public class Client{ 2 public static void main(String[] args) { 3 //面向接口编程 4 Api api = Factory.createApi("A"); 5 api.operation(); 6 } 7 }
这样做的好处:
1.客户端根本不需要直到具体实现是什么,也不需要知道如何实现,只知道工厂获得一个接口对象,然后通过这个接口获取想要的功能,达到所谓的面向接口编程。
2.实现客户端与具体实现类的解耦。
缺点:不支持开闭原则。