工厂方法模式
来源:互联网 发布:自然之名酵母水 知乎 编辑:程序博客网 时间:2024/06/10 15:31
一.背景
在Android其实很多用到该模式的,以onCreate为例,它就可以看作是一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给frameWork处理
二.具体定义
其实就是一个用于创建对象的接口,让子类决定实例化哪个类。
三.工厂方法模式的使用
public abstract class Product { /** * 产品类的抽象方法 * 由具体的产品类去实现 */ public abstract void method();}
public class ConcreteProductA extends Product { @Override public void method() { System.out.println("我是具体产品A"); }}
public class ConcreteProductB extends Product { @Override public void method() { System.out.println("我是具体产品B"); }}
public abstract class Factory { /** * 抽象工厂方法 * 具体生产什么由子类去实现 */ public abstract Product createProduct();}
public class ConcreteFactory extends Factory { @Override public Product createProduct() { return new ConcreteProductA(); //如果要生产B的话 //return new ConcreteProductB(); }}
public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product p = factory.createProduct(); p.method(); }}
缺点:
可以看出缺点在于,每次要生产其他的产品,都要去改ConcreteFactory,这样就很不方便。
解决方案如下:
public abstract class Factory{ /** * 抽象工厂方法 * 具体生产什么由子类去实现 * @param clz 产品对象类 类型 * @return 具体的产品对象 * */ public abstract <T extends Product> T createProduct(Class<T> clz);}
public class ConcreteFactory extends Factory{ @Override public <T extends Product> T createProduct(Class<T> clz){ Product p = null; try { p = Class.forName(clz.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T)p; }}
public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product p = factory.createProduct(ConcreteProductB.class); p.method(); }}
可以看出需要哪一个类的对象就传入哪一个类的类型即可,这种方法比较简洁,动态(学会!!!!!!),如果你不喜欢这种方式,也可以尝试为每一个产品都定义一个具体的工厂,各司其职。
(1)简单实现(用的就是上面的方法)
需求:生产奥迪Q3,Q5,Q7,这三个车内部构造差不多,但是自动驾驶的功能各有不同
public abstract class AudiCar{ /** * 汽车的抽象产品类 * 定义汽车的一个行为方法 车可以启动开走 * */ public abstract void drive(); /** *汽车的抽象产品类 * 定义汽车的一个行为方法 车可以自动巡航 * */ public abstract void selfNavigation();}
public class AudiQ3 extends AudiCar{ @Override public void drive() { System.out.println("Q3 启动了"); } @Override public void selfNavigation() { System.out.println("Q3 自动驾驶"); }}
public class AudiQ5 extends AudiCar{ @Override public void drive() { System.out.println("Q5 启动了"); } @Override public void selfNavigation() { System.out.println("Q5 自动驾驶"); }}
public class AudiQ7 extends AudiCar{ @Override public void drive() { System.out.println("Q7 启动了"); } @Override public void selfNavigation() { System.out.println("Q7 自动驾驶"); }}
public abstract class AudiFactory { /** * 某车型的工厂方法 * @param clz具体的SUV型号类型 * @return 具体型号的SUV车对象 * */ public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);}
public class AudiCarFactory extends AudiFactory{ @Override public <T extends AudiCar> T createAudiCar(Class<T> clz) { AudiCar car = null; try { car = (AudiCar)Class.forName(clz.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T)car; }}
public class Client{ public static void main(String[] args){ //构造一个制造汽车的工厂对象 AudiFactory factory = new AudiCarFactory(); //生产Q3并启动 AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class); audiQ3.drive(); audiQ3.selfNavigation(); //生产Q5并启动 AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class); audiQ5.drive(); audiQ5.selfNavigation(); //生产Q7并启动 AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class); audiQ7.drive(); audiQ7.selfNavigation(); }}
四.Android源码中的工厂方法模式
(1)ArrayList和HashSet中的Iterator其实就相当于一个工厂方法(相当于抓娃娃机器)
(2)public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new LinearLayout(this)); }}
每一个Activity都通过设置setContentView来设置不同的View
这其实就是一个工厂模式
<1>关于onCreate方法
对于一个应用程序来说,其真正的入口时在ActivityThread类中由我们熟悉的main方法
ActivityThread是一个final类,也就是说他不能被继承,一个应用程序对应一个ActivityThread,当Zygote进程孵化出一个新的应用进程后,会执行ActivityThread的main方法,main方法中做了一些比较常规的逻辑,比如准备Looper和消息队列,然后调用ActivityThead的attach方法将其绑定到ActivityManagerService中,开始不断地读取消息并分发消息。
分析待添加!!!!。。。。
总结:
缺点:每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 获取程序执行时的时间
- 伪币识别问题
- 【C语言】一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- AC自动机
- 即学即用笔记——利用for脚本实现批量移动文件/文件夹
- 工厂方法模式
- 音频-AudioComponentDescription 类型设置
- 获取系统的相关信息
- UVA 10069 dp+高精度
- javascript小方法之数组去重、数字转成逗号分隔、html元素去标签
- 120. Triangle
- 数据存储--SQLite创建数据库
- [矩阵快速幂] LightOJ 1142 - Summing up Powers (II)
- -bash: rz: command not found