美文网首页Android开发Android开发经验谈Android技术知识
应用最广泛的模式——工厂方法模式

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

作者: 程序员丶星霖 | 来源:发表于2019-01-21 11:39 被阅读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、反射等技术,增加了系统的实现难度。

学海无涯苦作舟

我的微信公众号

相关文章

  • Android 源码设计模式解析与实战 读书笔记 5 工厂方法模

    应用最广泛的模式 —— 工厂方法模式 1. 工厂方法模式介绍 工厂方法模式(Factory Pattern),是创...

  • 工厂模式

    工厂模式介绍 工厂模式是创建型设计模式之一。工厂方法模式是一种结构简单的模式,在平时开发中应用很广泛。 工厂方法模...

  • 应用最广-工厂方法模式

    模式介绍 工厂方法模式是应用最广泛的模式之一,也是创建型模式之一。工厂方法模式指的是定义出一个用于创建对象的接口,...

  • 工厂方法模式

    一、前言 工厂方法模式是创建型设计模式之一。工厂方法模式是一种很好的模式,在我们平时开发中应用很广泛。(Ps:如果...

  • 工厂方法模式 Factory Method Pattern

    工厂方法模式的介绍 工厂模式属于创建性模式,应用的非常广泛,提供了一种非常好的创建对象方式。 工厂方法的定义: D...

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

    介绍:工厂方法模式,是创建型设计模式之一。工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并...

  • Android设计模式——工厂模式

    应用最广泛的模式——工厂方法模式 工厂方法模式定义 定义一个用于创建对象的接口,让子类决定实例化哪个类。 使用场景...

  • 工厂模式

    大概 工厂模式是java设计模式中比较简单者,但却应用广泛,比如xml解析等,主要用于创建对象的时候,工厂模式的最...

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

    工厂方法模式定义: 定义一个创建对象的接口,让子类决定实例化哪个类。 工厂方法模式的使用场景: 在任何需要...

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

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

网友评论

    本文标题:应用最广泛的模式——工厂方法模式

    本文链接:https://www.haomeiwen.com/subject/eftodqtx.html