工厂设计模式
来源:互联网 发布:java 格式化上午下午 编辑:程序博客网 时间:2024/06/03 10:37
名称:Factory Method(工厂模式)
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod 使一个类的实例化延迟到其子类。
类图:
优点:
- 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
- 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
- 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。
适用环境:
- 当一个类不知道它所必须创建的对象的类的时候;
- 当一个类希望由它的子类来指定它所创建的对象的时候;
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类;
- 是代理者这一信息局部化的时候。
Android 中在创建网络NetworkStateTracker时使用了工厂模式,代码如下:
if (netFactory == null) { netFactory = new DefaultNetworkFactory(context, mTrackerHandler); } // 工厂接口 public interface NetworkFactory { public NetworkStateTracker createTracker(int targetNetworkType, NetworkConfig config); } // 工厂实现 private static class DefaultNetworkFactory implements NetworkFactory { private final Context mContext; private final Handler mTrackerHandler; public DefaultNetworkFactory(Context context, Handler trackerHandler) { mContext = context; mTrackerHandler = trackerHandler; } @Override public NetworkStateTracker createTracker(int targetNetworkType, NetworkConfig config) { switch (config.radio) { case TYPE_WIFI: return new WifiStateTracker(targetNetworkType, config.name); case TYPE_MOBILE: return new MobileDataStateTracker(targetNetworkType, config.name); case TYPE_DUMMY: return new DummyDataStateTracker(targetNetworkType, config.name); case TYPE_BLUETOOTH: return BluetoothTetheringDataTracker.getInstance(); case TYPE_WIMAX: return makeWimaxStateTracker(mContext, mTrackerHandler); // MStar Android Patch Begin case TYPE_ETHERNET: return EthernetStateTracker.getInstance(); case TYPE_PPPOE: return PppoeStateTracker.getInstance(); // MStar Android Patch End default: throw new IllegalArgumentException( "Trying to create a NetworkStateTracker for an unknown radio type: " + config.radio); } } } //实现产品创建 for (int targetNetworkType : mPriorityList) { final NetworkConfig config = mNetConfigs[targetNetworkType]; final NetworkStateTracker tracker; try { tracker = netFactory.createTracker(targetNetworkType, config); mNetTrackers[targetNetworkType] = tracker; } catch (IllegalArgumentException e) { Slog.e(TAG, "Problem creating " + getNetworkTypeName(targetNetworkType) + " tracker: " + e); continue; } tracker.startMonitoring(context, mTrackerHandler); if (config.isDefault()) { tracker.reconnect(); } }
0 0
- 设计模式--工厂设计
- 设计模式------工厂模式
- 设计模式------工厂模式
- 设计模式 [ 工厂模式 ]
- 设计模式--工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 工厂模式
- 设计模式-工厂模式
- 设计模式 -- 工厂模式
- 设计模式-工厂模式
- 设计模式----工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- c语言time.h函数库小结
- [学习笔记]JavaScript基础--缓冲1
- TCP/IP详解学习笔记--TCP的坚持和保活定时器
- hdoj.4813 Hard Code【水题】 2015/08/08
- hash hdu1247 Hat’s Words
- 工厂设计模式
- 黑马程序员---struts2学习笔记之六(自定义拦截器)
- Android Gallery3D源码分析(二)
- NEUQ 1466: Huybery玩转模运算
- SDL播放yuv数据
- PageRank及其MapReduce实现
- [学习笔记]JavaScript基础--淡入淡出
- muduo::TcpConnection分析
- 周赛 简单的bfs