白话描述工厂模式
写一个工厂类,提供一个个方法获取生厂产品的接口。
备注
关注是产品的接口, 有几个产品实现类呢,只有一个,直接new了,不然造成多很多代码的。
接口定义
//接口 生成产品的
public interface MessageView{
void bindView(Context context)
}
实现接口的产品
//具体的产品
文本消息
public class TxtViewHolder implements MessageView{
@Override
public void bind(Context context){
}
}
语言消息
public class AudioViewHolder implements MessageView{
@Override
public void bind(Context context){
}
}
图片消息
public class ImgViewHolder implements MessageView{
@Override
public void bind(Context context){
}
}
等等各种消息类型显示
提供一个工厂方法
public class MessageViewFactory{
public MessageView getMessageView(String type){
if(type equals XXX){
return new XXXX
}else if(xxxxx){
xxxxx
}
....
}
}
策略模式对工厂模式的优化
工厂模式 工厂类获取产品方法,会出现if else if的写法,这个可以通过策略模式优化
每个产品实现类,可以看做是个策略
在工厂类中加入个static代码块, 根据type注册进入Map集合中。
public class MessageViewFactory{
private static MessageViewFactory factory = new MessageViewFactory();
private MessageViewFactory(){}
private static Map strategyMap =new HashMap<>();
static{
//定义个类型枚举
strategyMap.put(MessageTypeEnum.TXT,new TxtViewHolder());
strategyMap.put(MessageTypeEnum.IMG,new ImgViewHolder());
...
}
Public MessageView creator(int type){
strategyMap.get(type);
}
public static MessageViewFactory getInstance(){
return factory;
}
}
采用反射优化if else if
public static <T extends MessageView> T getMessageView(Class<T> cls){
MessageView messageView = null;
try{
messsageView = (MessageView)Class.forName(cls.getName).newInstance();
}catch(Exception e){
e.printStackTrace()
}
return messageView;
}