您的位置:首页 > 其它

工厂模式的enum实现

2015-10-19 18:17 429 查看
静态工厂DoorFactory的if-else比较难看、不遵循OCP,但是简洁。俗话说得好,一个简洁三个爱。

public class DoorFactory{
public static Door getObject(String typeName)	{//int ID
if(typeName.equals("D1")){
return new D1();
}else if(typeName.equals("D2")){
return new D2();
}else{
return null;
}
}
}
工厂方法模式避免分支结构的技术,但是工厂和产品成对出现。
public class D1Factory implements Factory{
@Override public Door getObject(){
return new D1();
}
}



工厂模式的enum实现,外表是参数化工厂,内涵工厂方法模式。

public enum DoorType{
D1("D1"){
@Override  public Door getObject(){
return new D1();
}
},
D2("D2"){
@Override  public Door getObject(){
return new D2();
}
};
private String type;
private DoorType( String type )	{
this.type = type;
}

public abstract Door getObject();
}
DoorType中定义了工厂方法getObject(),匿名类给出了对应于工厂方法模式中的D1Factory等类型。工厂方法模式中,增加D3Factory不必修改其他代码,而这里就需要添加新的枚举项——减少D1Factory等源文件的代价。

接着是参数化工厂方法getObject(String)

public class DoorFactory_Enum{
private static HashMap<String,DoorType> typeMap = new HashMap<>();
static{
typeMap.put("D1", DoorType.D1);
typeMap.put("D2", DoorType.D2);
}

public static Door getObject(String typeName){
return typeMap.get(typeName).getObject();
}
}
外界的用法:

    public static void testEnum(){

        Door d = DoorFactory_Enum.getObject("D1");

        d.m();

        d = DoorType.valueOf("D2").getObject();

        d.m();

    }

作业:讨论参数化工厂,工厂方法模式的优缺点。工厂模式的enum实现的优缺点。

链接:Java之enum



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: