设计模式:工厂 (Factory)

简单工厂

如果我们面临着接口选择问题我们应该使用工厂的方式去创建代码。

使用工厂方法模式的使用,不仅优化的创建部分。也为以后的拓展留下良好的空间。

解读

有一次面试的时候,面试官问我这样一个问题:“设计一个程序,他既能解析XML类型的数据,也能解析json类型的数据。说一下你的构思。”这是真实发生的事件。接下来,我给大家分享一下我的设计思路。
1:看到了这个问题的时候,我首先想到的是,同样都是解析,那么应该抽象一个共同的父类。他们共同行为是解析(Parser).具体的解析实现应该是子类自己去实现。
2:XML与json解析的创建过程可能会不一样。但这个创建的行为,使用者可以不需要知道。(使用者只需要知道名称就行了)
3:拓展方面,假如需要增加另外一种解析。也可以在不破坏原来的代码情况下增加。为了更加方便使用者去使用这个对象。我可以使用工厂方法。
4:使用起来,能够替换方便

实现关键

1:创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
2:如果想增加一个产品,只要扩展一个工厂类就可以。

Factory

抽象出共同行为,共同的行为就是解析

public interface Parser {
    //共同的行为就是解析。
    public void onParser();
}

子类自己实现细节。

public class JsonParser implements Parser{
    @Override
    public void onParser() {
        // TODO Auto-generated method stub
        System.out.println("Json 解析");
    }
}
public class XMLParser implements Parser{
    @Override
    public void onParser() {
        // TODO Auto-generated method stub
        System.out.println("XML 解析");
    }
}

由于解析的对象,创建时可能是复杂的,我们把这两个对象放进工厂中“隐蔽”起来。只需要返回一个解析器的对象即可。这也是为了使用起来更加方便。

public abstract class AbstractParserFactory {
    //隐蔽创建过程
    public abstract Parser create(); 
}

public class JsonParserFactory extends AbstractParserFactory{ 
    //创建,并返回一个解析器
    @Override
    public Parser create() {
        // TODO Auto-generated method stub
        return new JsonParser();
    }
}

public class XMLParserFactory extends AbstractParserFactory{
    //创建,并返回一个解析器
    @Override
    public Parser create() {
        // TODO Auto-generated method stub
        return new XMLParser();
    }
}

最后我们在客户端使用起来就很方便。

                //工厂
//      AbstractParserFactory factory = new JsonParserFactory();
        AbstractParserFactory factory = new XMLParserFactory();
        Parser parser = factory.create();
        parser.onParser();

这样设计,不仅使用简单,而且方便拓展。 如果有需要可以在工厂中增加资质判断。

类图

工厂.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,378评论 1 15
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,330评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,929评论 18 399
  • 我接触到正面管教是在去年10月,那时我儿子刚从非传统园蒙特梭利幼儿园进入小学一年级,孩子带给了我不可思议的挑战...
    安息香雪霞阅读 2,924评论 0 0
  • 璇好美小姐阅读 734评论 0 0