如何设计?

cngaler 2016-06-30 11:16:33
有三种品牌的手机 PhoneA,PhoneB,PhoneC,各自包含一些型号。比如 A有A1,A1S,A2,B有Bnote,Bnote2,C有 Cplus
每种型号都存在一种操作action,假如说是解锁。

如何设计Phone和PhoneA等,使PhoneA等继承于Phone,或者是实现Phone接口,使我只使用下面这2句代码,就可以得到A2对应的解锁操作

Phone ph = Phone.get("A2");
ph.action();


当然,是要考虑扩展的,只考虑下列3种情况,比如新来了一种品牌的手机PhoneD,或者新来了一种型号Cplus++,或者有新的操作action_ex
...全文
147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
解开者 2016-06-30
  • 打赏
  • 举报
回复
最基本的设计之一,依赖具体实现类的完整类名创建实例。如果不想用完整类名也可以建立一个静态Map,不过需要额外维护。 使用forName还能带来一个优势就是支持热插拔,即需要的具体实现类可以在运行时动态加载,或者通过代理动态创建。
public class PhoneTest {
	public static void main(String[] args) {
		Phone ph = Phone.get("PhoneA2");
		ph.action();
	}
}

abstract class Phone {
	static Phone get(String clazz) {
		try {
			return (Phone) Class.forName(clazz).newInstance();
		} catch (Exception e) {
		}
		return null;
	}

	void action() {
		System.out.println(this.getClass());
	}
}

class PhoneA2 extends Phone {
}
解开者 2016-06-30
  • 打赏
  • 举报
回复
对于方案一,也可以把接口直接开放到Class对象级别,这样可以同时支持代码混淆和热插拔。 实际情况是有品牌和型号两级抽象,如果品牌之间没有区别,其实品牌这一级抽象不是必要的。
public class PhoneTest {
	public static void main(String[] args) {
		Phone ph = Phone.get(PhoneA2.class);
		ph.action();
	}
}

abstract class Phone {
	static Phone get(Class<? extends Phone> clazz) {
		try {
			return clazz.newInstance();
		} catch (Exception e) {
		}
		return null;
	}

	void action() {
		System.out.println(this.getClass());
	}
}

class PhoneA2 extends Phone {
}
cngaler 2016-06-30
  • 打赏
  • 举报
回复
thanks ,很有启发
soton_dolphin 2016-06-30
  • 打赏
  • 举报
回复
用 abstract factory 模式咯
解开者 2016-06-30
  • 打赏
  • 举报
回复
引用 2 楼 lfy2217 的回复:
经过代码混淆之后这个能用吗?
如果改变了代码中的类名就会受到影响。如果希望对代码进行后续操作,就需要维护字符串和实现类的映射。 下列代码,除了能不受类名变化影响之外,还能定制参数的字符串。缺点是额外增加了维护成本:新增实现类需要维护map。
import java.util.HashMap;
import java.util.Map;

public class PhoneTest {
	public static void main(String[] args) {
		Phone ph = Phone.get("A2");
		ph.action();
	}
}

abstract class Phone {
	private static Map<String, Class<? extends Phone>> map = new HashMap<String, Class<? extends Phone>>();
	static {
		map.put("A2", PhoneA2.class);
	}

	static Phone get(String key) {
		try {
			return map.get(key).newInstance();
		} catch (Exception e) {
		}
		return null;
	}

	void action() {
		System.out.println(getClass());
	}
}

class PhoneA2 extends Phone {
}
cngaler 2016-06-30
  • 打赏
  • 举报
回复
经过代码混淆之后这个能用吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧