PolicyManager工厂模式与动态加载
来源:互联网 发布:程序员实用工具 编辑:程序博客网 时间:2024/04/26 06:16
PolicyManager工厂模式与动态加载
Android FrameWork——PolicyManager
在学习Android跟踪setContentView执行过程代码的时遇到:
Attach(){
//着实不清楚PolicyManager到底如何创建的,哪一个对象。
mWindow = PolicyManager.makeNewWindow(this);
}
其中用到Class.forName动态加载,Java是最近才学的还真不晓得有这样的用法;
一 类之间关系
于是就了解一下PolicyManager以及相关类实现方式;
首先看一下各个类之间的UML图:
PolicyManager:提供了静态类方法接口,用于创建Window,LayoutInflate,
WindowManagerPolicy类实例;属于工厂方法;
IPolicy:提供抽象Policy创建产品接口;
Policy:具体IPolicy,实现创建产品接口;
二 代码分析
1 IPolicy
/* The implementation of this interface must be called Policy and contained * within the com.android.internal.policy.impl package */public interface IPolicy { public Window makeNewWindow(Context context); public LayoutInflater makeNewLayoutInflater(Context context);public WindowManagerPolicy makeNewWindowManager(); }
2 Policy
public class Policy implements IPolicy { private static final String TAG = "PhonePolicy";
//提供需要预先加载的 类 private static final String[] preload_classes = { "com.android.internal.policy.impl.PhoneLayoutInflater", "com.android.internal.policy.impl.PhoneWindow", "com.android.internal.policy.impl.PhoneWindow$1", "com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback", "com.android.internal.policy.impl.PhoneWindow$DecorView", "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState", "com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState", };
//静态模块 static { // For performance reasons, preload some policy specific classes when // the policy gets loaded. for (String s : preload_classes) { try { //动态加载指定的类 Class.forName(s); } catch (ClassNotFoundException ex) { Log.e(TAG, "Could not preload class for phone policy: " + s); } } }
//创建具体对象的接口 public PhoneWindow makeNewWindow(Context context) { return new PhoneWindow(context); } public PhoneLayoutInflater makeNewLayoutInflater(Context context) { return new PhoneLayoutInflater(context); } public PhoneWindowManager makeNewWindowManager() { return new PhoneWindowManager(); }}
3 PolicyManager
//访问类的静态成员的时候 会加载该类public final class PolicyManager { private static final String POLICY_IMPL_CLASS_NAME = "com.android.internal.policy.impl.Policy";
private static final IPolicy sPolicy; //加载该类时,所有静态成员均被会加载 static { try { //动态加载创建类实例 Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME); //创建了sPolicy指向的实例 sPolicy = (IPolicy)policyClass.newInstance(); } catch (ClassNotFoundException ex) {} } //构造函数私有类型,不能创建该类实例 private PolicyManager() {} // The static methods to spawn new policy-specific objects public static Window makeNewWindow(Context context) { return sPolicy.makeNewWindow(context); } public static LayoutInflater makeNewLayoutInflater(Context context) { return sPolicy.makeNewLayoutInflater(context); } public static WindowManagerPolicy makeNewWindowManager() { return sPolicy.makeNewWindowManager(); }}
这里要注意的就是:动态加载Class.forName:
Class.forName()返回一个类;
String str = 用户输入的字符串
Class classType = Class.forName(str); //返回一个类
classType.newInstance(); //创建一个classType 类型的对象
在上述代码中:
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME); //加载Policy类
sPolicy = (IPolicy)policyClass.newInstance(); //创建Policy对象 给IPolicy类型sPolicy引用;
这样动态加载加上使用工厂方法:降低耦合,提高代码的灵活性和扩展性;
- PolicyManager工厂模式与动态加载
- C++ 宏定义动态加载、工厂模式
- DAO,接口,工厂模式,java类的动态加载,ioc
- 动态的工厂模式
- 设计模式学习(二):接口的作用1-动态加载实例-简单工厂模式
- 工厂模式与抽象工厂
- 动态工厂模式代码实例
- 动态工厂模式---(3)
- 简单工厂模式与工厂方法模式
- 工厂模式与抽象工厂模式
- 简单工厂模式与工厂方法模式
- 工厂模式与抽象工厂模式
- c#工厂模式与抽象工厂模式
- 简单工厂模式与工厂方法模式
- 简单工厂模式与工厂方法模式
- 简单工厂模式 与 抽象工厂模式
- 工厂模式与工厂方法模式
- c#工厂模式与抽象工厂模式
- 关于apt配置文件sources.list
- 2017.03.15_容器之collection和equals方法
- 纠缠谎言蒙蔽双眼 而真实 已埋没
- Android学习 View与Composite模式应用
- 面试总结一
- PolicyManager工厂模式与动态加载
- 使用Process进行DOS命令交互的简单应用
- 51nod1682:中位数计数(前缀和)
- pageGroup.js分页器的使用
- FlyWeight模式
- ESP8266--学习笔记(一)串口输出HelloWorld
- POJ 2376 Cleaning Shifts
- RPC之——轻量级分布式RPC框架实战
- CSS-关于定位,你所需要知道的一切