工厂方法模式

Posted Arcturis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法模式相关的知识,希望对你有一定的参考价值。

工厂方法模式适用场景:

  在生成各种复杂对象的时候,且这些对象职责不尽相同

工厂方法使用代码:我们举个例子吧,比如我有很多不同的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 <T>
     * @return 具体的产品对象
     */
    public abstract <T extends Querry> T getQuerryClass (Class<T> clz);
}

然后我们去实现这个抽象工厂让他运作起来

public class ConcreteFactory extends QuerryFactory {
    @Override
    public <T extends Querry> T getQuerryClass(Class<T> 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());
......

上面是获取了某一个类的应用,获取其他的类的方法类似

 

以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-简单工厂工厂方法模式抽象工厂模式详解

工厂方法模式

设计模式-工厂方法模式(Go实现)

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

设计模式---工厂模式