Android源码学习之工厂方法模式应用及优势介绍
简介
工厂方法模式是一种常用的创建型设计模式,它主要解决了如何有效率地创建复杂对象的问题。在Android源码中,我们会发现很多地方都应用了工厂方法模式,比如LayoutInflater的实现、RecyclerView.Adapter的实现等等,因此学好工厂方法模式对于理解Android源码非常重要。
工厂方法模式介绍
工厂方法模式是指定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化延迟到其子类中进行。
工厂方法模式包含四个角色:
- 抽象工厂角色:定义所有创建对象的接口,可以是抽象类、接口或者抽象具体类。
- 具体工厂角色:具体实现创建对象方法的类
- 抽象产品角色:所有对象的父类或接口
- 具体产品对象:具体工厂生产的对象实例
工厂方法模式示例
下面用一个简单的例子来说明工厂方法模式的实现过程。
首先定义抽象产品角色 Message,其中包含一个抽象方法 send:
public abstract class Message {
public abstract void send(String message);
}
然后定义具体产品角色 Email 和 SMS,实现 Message 接口:
public class Email extends Message {
@Override
public void send(String message) {
System.out.println("发送邮件: " + message);
}
}
public class SMS extends Message {
@Override
public void send(String message) {
System.out.println("发送短信: " + message);
}
}
接着定义抽象工厂角色 MessageFactory,其中包含创建 Message 对象的抽象方法 createMessage:
public abstract class MessageFactory {
public abstract Message createMessage();
}
然后定义具体工厂角色 EmailFactory 和 SMSFactory,实现 MessageFactory 接口:
public class EmailFactory extends MessageFactory {
@Override
public Message createMessage() {
return new Email();
}
}
public class SMSFactory extends MessageFactory {
@Override
public Message createMessage() {
return new SMS();
}
}
最后,在客户端中使用具体工厂角色中的 createMessage 方法来获得 Message 对象:
public class Client {
public static void main(String[] args) {
MessageFactory factory = new EmailFactory();
Message message = factory.createMessage();
message.send("Hello World!");
}
}
在上面的代码中,我们用 EmailFactory 创建了一个 Email 对象,并通过 send 方法发送了一条消息。
工厂方法模式的优势
工厂方法模式有以下几个优势:
- 可以对客户端隐藏对象创建的细节,将对象的创建和使用分离。
- 可以方便地扩展工厂和产品,简化了系统的设计。
- 符合面向对象编程的开闭原则,当需要增加新的产品时只需要增加具体产品和对应的工厂即可。
Android源码中的工厂方法模式应用示例
现在我们来看一个Android源码中工厂方法模式的应用示例,以LayoutInflater为例。
在Android中,Activity的 setContentView 方法可以用来设置布局。在 setContentView 方法中,会调用 LayoutInflater 的 inflate 方法,将前面 Activity 中设置的布局 XML 文件解析成对应的View对象。
下面是 LayoutInflater 实现中对应的代码:
View inflate(int resource, ViewGroup root, boolean attachToRoot)
{
// 省略部分代码
LayoutInflater.Factory factory = getFactory();
if (factory != null) {
view = factory.onCreateView(name, context, attrs);
}
// 省略部分代码
return view;
}
在上面的代码中,LayoutInflater 会先判断是否设置了 Factory,并通过 Factory 的 onCreate 方法创建对应的View对象。如果没有设置 Factory,则使用默认的 View 创建逻辑创建View对象。
这里的 Factory 就是一个工厂方法模式的实现,我们可以通过自定义Factory来扩展LayoutInflater的功能,非常方便。
再来看一个工厂方法模式在RecyclerView.Adapter实现中的应用示例。
在RecyclerView中,需要我们自己定义一个Adapter来绑定数据和实现视图的创建。在Adapter 中,会用到ViewHolder来缓存视图中的子View。
下面是RecyclerView.Adapter的实现中,ViewHolder 的创建代码:
public abstract static class Adapter<VH extends ViewHolder> {
// 省略部分代码
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
// 省略部分代码
}
public static abstract class ViewHolder {
// 省略部分代码
public ViewHolder(View itemView) {
super(itemView);
}
}
在上面的代码中,ViewHolder 是抽象产品角色,由 Adapter 中的具体工厂角色来创建。
我们只需要在Adapter的子类中实现 onCreateViewHolder 方法,并在 onCreateViewHolder 方法中返回对应的 ViewHolder(具体产品角色)对象即可。这样就可以很方便地实现RecyclerView的Adapter功能,并且可以扩展各种类型的ViewHolder。
总结
工厂方法模式是一种常用的设计模式,通过把对象的创建和具体的实现分离,达到了更好的解耦和复用效果。在Android中的应用也非常广泛,如LayoutInflater和RecyclerView.Adapter的实现都是使用了工厂方法模式,因此学习工厂方法模式对于理解Android源码非常重要。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android源码学习之工厂方法模式应用及优势介绍 - Python技术站