工厂方法模式适用场景:
在生成各种复杂对象的时候,且这些对象职责不尽相同
工厂方法使用代码:我们举个例子吧,比如我有很多不同的http查询请求,然后http请求的操作抽象出来其实都是两个操作,一个是先设置http post请求头,然后再发送post请求
所以我们就可以通过工厂类获取http请求具体类型,这样代码逻辑更加清晰,易于修改
首先是Http查询抽象基类
public abstract class Querry { /** * 抽像查询方法 */ public abstract void querryMethod(String querryKey); /** * 获取查询头 * @return */ public abstract String getQuerryHeader();}
其次是抽象工厂类
、
public abstract class QuerryFactory { /** * 抽象工厂方法 * 具体生产什么由具体的子类实现 * @param clz 产品对象类型 * @param* @return 具体的产品对象 */ public abstract T getQuerryClass (Class clz);}
然后我们去实现这个抽象工厂让他运作起来
public class ConcreteFactory extends QuerryFactory { @Override publicT getQuerryClass(Class clz) { Querry q =null; /** * 通过反射获取类的示例 */ try{ q = (Querry)Class.forName(clz.getName()).newInstance(); }catch (Exception e){ e.printStackTrace(); } return (T) q; }}
这里是通过反射的方式通过获取类的类型然后返回对应的类的类的实例
然后我们就可以具体的去写http请求的类了,比如QuerryA,QuerryB...
然后再使用的地方先实例化工厂方法,然后执行工厂“生产”出来的产品方法即可
//实例化一个工厂方法QuerryFactory factory = new ConcreteFactory();//获取查询实例类Querry querryGasNum=factory.getQuerryClass(HttpQuerxxx.class);querryGasNum.querryMethod(etQuerryInfo.getText().toString(),getActivity()); ......
上面是获取了某一个类的应用,获取其他的类的方法类似