应用最广泛的模式——工厂方法模式
2019-01-21 本文已影响7人
程序员丶星霖
《Android源码设计模式解析与实战》读书笔记(五)
《Android源码设计模式解析与实战》PDF资料下载
一、工厂方法模式简介
工厂方法模式,是创建型设计模式之一。
1.1、定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
1.2、使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。
二、工厂方法模式的简单实现
public abstract class AudiFactory {
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 abstract class AudiCar {
/**
* 汽车的抽象产品类
* <p>
* 定义汽车的一个行为方法,车可以启动开走
*/
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开始自动巡航!");
}
}
//构造一个制造汽车的工厂对象
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();
输出结果:
![](https://img.haomeiwen.com/i4625756/628244146d5407a2.png)
三、工厂方法模式实战
以数据存储为例,代码如下所示:
public abstract class IOHandler {
/**
* 添加一条个人信息
* @param id
* @param name
*/
public abstract void add(String id, String name);
/**
* 删除一条个人信息
* @param id
*/
public abstract void remove(String id);
/**
* 更新一条个人信息
* @param id
* @param name
*/
public abstract void update(String id, String name);
/**
* 查询身份证对应的人名
* @param id
* @return
*/
public abstract String query(String id);
}
对每一种持久化方式都定义一个具体的IO处理类,分别为普通文件存储、xml文件存储和SQLite数据库存储。
public class FileHandler extends IOHandler {
@Override
public void add(String id, String name) {
}
@Override
public void remove(String id) {
}
@Override
public void update(String id, String name) {
}
@Override
public String query(String id) {
return "AigeStudio";
}
}
public class XMLHandler extends IOHandler {
@Override
public void add(String id, String name) {
}
@Override
public void remove(String id) {
}
@Override
public void update(String id, String name) {
}
@Override
public String query(String id) {
return "SMBrother";
}
}
public class DBHandler extends IOHandler {
@Override
public void add(String id, String name) {
}
@Override
public void remove(String id) {
}
@Override
public void update(String id, String name) {
}
@Override
public String query(String id) {
return "Android";
}
}
定义一个工厂类,如下:
public class IOFactory {
public static <T extends IOHandler> T getIOHandler(Class<T> clz) {
IOHandler handler = null;
try {
handler = (IOHandler) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) handler;
}
}
四、总结
4.1、优点
- 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
- 基于工厂角色和产品角色的多态性设计师工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
- 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也变得更好,符合“开闭原则。
4.2、缺点
- 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
- 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
学海无涯苦作舟
![](https://img.haomeiwen.com/i4625756/f3d89cd98c6de432.jpg)