Android开发框架/库学习,设计模式之工厂模式

来源:互联网 发布:mysql my.ini在哪里 编辑:程序博客网 时间:2024/05/18 19:44

工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。


介绍

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

应用实例
1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。

优点
1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,”POP3”、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。


Java Demo

1.创建一个接口

public interface Car {    void run();}

2.创建实现接口的实体类

Automobile.java

public class Automobile implements Car {    @Override    public void run() {        System.out.print("我是汽车,正在行驶");    }}

PoliceCar.java

public class PoliceCar implements Car {    @Override    public void run() {        System.out.print("我是警车,在行驶");    }}

Bicycle.java

public class Bicycle implements Car {    @Override    public void run() {        System.out.print("我是单车,骑车中");    }}

3.创建一个工厂,生成基于给定信息的实体类的对象

CarFactory.java

public class CarFactory {    public Car getCar(String type) {        if (type == null) {            return null;        }        if (type.equals("Automobile")) {            return new Automobile();        } else if (type.equals("PoliceCar")) {            return new PoliceCar();        } else if (type.equals("Bicycle")) {            return new Bicycle();        }        return null;    }}

4.使用该工厂,通过传递类型信息来获取实体类的对象

public class Main {    public static void main(String[] args) {        CarFactory carFactory = new CarFactory();        Car automobile = carFactory.getCar("Automobile");        automobile.run();        Car policeCar = carFactory.getCar("PoliceCar");        policeCar.run();        Car bicycle = carFactory.getCar("Bicycle");        bicycle.run();    }}

输出结果

我是汽车,正在行驶我是警车,在行驶我是单车,骑车中

Android中工厂模式的使用

通过上面的例子,现在在总结一下思路,工厂模式其实就是定义一个用于创建对象的接口,让子类来决定实例化哪个类。
在任何需要生成复杂对象的地方,都可以使用工厂模式。如果是简单的通过new就可以完成对象创建,则没有必要去使用工厂模式了。

工厂模式的实践

以Android中的数据保存开发为例子,其中包括了SQLite、SharedPreferences或者File。这里先定义一个抽象类,这个抽象类定义了总的增删改查,但是没有具体的实现,只是定义了它的所有子类的行为准则,而这些子类对象的生成,则是由一个工厂类来进行实现。

IOHandler.java

public abstract class IOHandler {    public abstract void add(int id, String name);    public abstract void delete(int id);    public abstract void update(int id, String name);    public abstract void query(int id);}

继承于这个总的抽象类,编写各个子类,分别是SQLite、XML和File。

DBHandler.java

public class DBHandler extends IOHandler {    @Override    public void add(int id, String name) {    }    @Override    public void delete(int id) {    }    @Override    public void update(int id, String name) {    }    @Override    public String query(int id) {        return "数据库";    }}

XMLHandler.java

public class XMLHandler extends IOHandler {    @Override    public void add(int id, String name) {    }    @Override    public void delete(int id) {    }    @Override    public void update(int id, String name) {    }    @Override    public String query(int id) {        return "XML";    }}

FileHandler.java

public class FileHandler extends IOHandler {    @Override    public void add(int id, String name) {    }    @Override    public void delete(int id) {    }    @Override    public void update(int id, String name) {    }    @Override    public String query(int id) {        return "File";    }}

然后来编写一个工厂类,通过工厂类里的方法来获得我们想要的子类对象。这个工厂类这里是通过反射来得到实例对象。

IOFactory.java

public class IOFactory {    public static <T extends IOHandler> T getIOHandler(Class<T> tClass) {        IOHandler handler = null;        try {            handler = (IOHandler) Class.forName(tClass.getName()).newInstance();        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {            e.printStackTrace();        }        return (T) handler;    }}

最后,开始使用工厂模式来写出优雅的调用:

IOHandler handler = IOFactory.getIOHandler(DBHandler.class);handler.add(666, "小明");handler.query(666);

这里的调用只是一个展示,最主要的是,理解了这个思想就可以了,为接下来框架开发打下理论基础。

0 0
原创粉丝点击