Android设计模式(四)- 工厂方法模式
来源:互联网 发布:八度网络空间 编辑:程序博客网 时间:2024/05/16 13:51
原文地址 http://blog.csdn.net/qq_25806863/article/details/67110082
工厂方法模式也是创建型模式。
工厂模式根据抽象程度可以分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。
简书地址
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
使用场景
任何需要生成复杂对象的地方,都可以使用工厂方法模式。用new就能创建的对象不需要使用工厂模式,因为使用工厂模式就要增加一个工厂类,增加了系统复杂度。
UML
模式1
抽象的产品:
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(); }}
客户端使用:
public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product product = factory.createProduct(); product.method(); }}
这样就生产出来一个ConcreteProductA。
如果想生产ConcreteFactory,在ConcreteFactory里修改为返回ConcreteFactory就行了。
public class ConcreteFactory extends Factory { @Override public Product createProduct() { return new ConcreteProductB(); }}
模式2
通过反射来了解要生产哪个产品
抽象工厂:
public abstract class Factory { 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 product = null; try { product= (Product) Class.forName(clz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (T) product; }}
客户端调用:
public class Client { public static void main(String[] args) { Factory factory = new ConcreteFactory(); Product product = factory.createProduct(ConcreteProductB.class); product.method(); }}
这样,客户端调用的时候,传入什么产品就生产什么产品。
模式3
可以为每个产品都创建一个具体的工厂类,如:
public class ConcreteFactoryA extends Factory { @Override public Product createProduct() { return new ConcreteProductA(); }}public class ConcreteFactoryB extends Factory { @Override public Product createProduct() { return new ConcreteProductA(); }}
要生产哪个就调用哪个工厂。
这种叫多工厂方法模式。
简单工厂模式(静态工厂模式)
当确定工厂类只有一个的时候,
public class Factory{ public static Product createProduct(){ return new ConcreteProductA(); //return new ConcreteProductB(); }}
简单实现
以汽车举个例子,
抽象的汽车厂:
public abstract class AodiFactory { public abstract <T extends AodiCar> T createAudiCar(Class<T> clz);}
具体的汽车生产工厂:
public class AodiCarFactory extends AodiFactory { @Override public <T extends AodiCar> T createAudiCar(Class<T> clz) { AodiCar aodiCar = null; try { aodiCar = (AodiCar) (Class.forName(clz.getName())).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) aodiCar; }}
抽象的汽车:
public abstract class AodiCar { public abstract void diver(); public abstract void selfNav();}
具体的汽车:
public class AodiQ3 extends AodiCar { @Override public void diver() { System.out.println("Q3启动"); } @Override public void selfNav() { System.out.println("Q3导航"); }}public class AodiQ5 extends AodiCar { @Override public void diver() { System.out.println("Q5启动"); } @Override public void selfNav() { System.out.println("Q5导航"); }}
客户端调用:
public class Client { public static void main(String[] args) { AodiFactory aodiFactory = new AodiCarFactory(); AodiCar Q3 = aodiFactory.createAudiCar(AodiQ3.class); Q3.diver(); Q3.selfNav(); AodiCar Q5 = aodiFactory.createAudiCar(AodiQ5.class); Q5.diver(); Q5.selfNav(); }}
Android源码中的工厂方法
书中举例是Activity的onCreate()方法,理由是:在不同的Activity的onCreate方法中调用setContentView会根据设置的不同的布局文件而产生不同的布局,所以可以看做是一个工厂。
个人觉得有点牵强吧。。。不知道你们怎么看呢?
有个很明显的BitmapFactory,应该是符合简单工厂模式的:
package android.graphics;public class BitmapFactory { public static Bitmap decodeFile(String pathName, Options opts) { Bitmap bm = null; ...... return bm; } //有很多静态方法返回一个Bitmap对象。}
总结
优点
- 降低了对象之间的耦合度,代码结构清晰,对调用者隐藏了产品的生产过程,生产过程改变后,调用者不用做什么改变,易于修改。
- 易于拓展,要增加工厂和产品都非常方便,直接实现接口,不用修改之前的代码。
缺点
缺点应该就是会让系统结构复杂化了,如果是非常简单的结构就不需要使用这种模式了。
- Android设计模式(四)- 工厂方法模式
- 设计模式(四) ---- 工厂方法模式
- 设计模式(四)工厂模式-工厂方法模式
- 设计模式<四>简单工厂模式与工厂方法模式
- 面向对象的设计模式(四),工厂方法模式
- PHP设计模式系列(四):工厂方法模式
- C++设计模式四--FactoryPattern(工厂方法模式)
- 设计模式笔记(四)--工厂方法模式、抽象工厂模式
- 设计模式(四)-工厂模式-抽象工厂模式
- 设计模式(四)简单工厂模式
- 设计模式(四)简单工厂模式
- Android设计模式---工厂方法模式和抽象工厂模式
- 工厂方法模式(四)
- (四)工厂方法模式
- Android设计模式系列--工厂方法模式
- android设计模式之工厂方法模式
- Android设计模式系列--工厂方法模式
- Android设计模式系列--工厂方法模式
- Window7搭建IIS web服务器
- Last Working Day in NOKIA
- 妙味课堂最新整理移动端开发之事件交互远程班
- 安卓web app开发
- pandas基本用法(一)
- Android设计模式(四)- 工厂方法模式
- LeetCode First Unique Character in a String
- SLA by Short brain-Mar-2017
- 沉淀-初级html5(一)
- Android之IntentService使用
- 递归算法的时间复杂度
- 专门弄一个分类放解决TLE的题
- 欢迎使用CSDN-markdown编辑器
- 生成对抗网络