Android开发Android开发经验谈Android技术知识

应用最广泛的模式——工厂方法模式

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();

输出结果:

工厂模式.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、优点

  1. 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
  2. 基于工厂角色和产品角色的多态性设计师工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
  3. 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也变得更好,符合“开闭原则。

4.2、缺点

  1. 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
  2. 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

学海无涯苦作舟

我的微信公众号
上一篇 下一篇

猜你喜欢

热点阅读