应用最普遍的模式——工厂方法模式

《Android源码设计模式解析与实战》读书笔记(五) 《Android源码设计模式解析与实战》PDF资料下载php

1、工厂方法模式简介

工厂方法模式,是建立型设计模式之一。数据库

1.一、定义

定义一个用于建立对象的接口,让子类决定实例化哪一个类。设计模式

1.二、使用场景

在任何须要生成复杂对象的地方,均可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就能够完成建立的对象无需使用工厂模式。bash

2、工厂方法模式的简单实现

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

3、工厂方法模式实战

以数据存储为例,代码以下所示:ide

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数据库存储。ui

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";
    }
}
复制代码

定义一个工厂类,以下:spa

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、总结

4.一、优势

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

4.二、缺点

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

学海无涯苦做舟

个人微信公众号
相关文章
相关标签/搜索