简单工厂
如果我们面临着接口选择问题我们应该使用工厂的方式去创建代码。
使用工厂方法模式的使用,不仅优化的创建部分。也为以后的拓展留下良好的空间。
解读
有一次面试的时候,面试官问我这样一个问题:“设计一个程序,他既能解析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();
这样设计,不仅使用简单,而且方便拓展。 如果有需要可以在工厂中增加资质判断。
网友评论