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);
这里的调用只是一个展示,最主要的是,理解了这个思想就可以了,为接下来框架开发打下理论基础。
- Android开发框架/库学习,设计模式之工厂模式
- Android开发框架/库学习,设计模式之策略模式
- Android 设计模式学习之工厂模式
- Android学习之设计模式之工厂模式
- Android开发框架/库学习,设计模式之建造者模式
- Android开发设计模式之——工厂模式
- Android的开发之&java23中设计模式------>工厂模式
- Android设计模式之工厂设计模式
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式学习之工厂模式(简单工厂模式)
- 设计模式学习之简单工厂模式和工厂模式
- 设计模式入门学习之工厂模式
- 设计模式学习笔记之工厂模式
- 设计模式学习之简单工厂模式
- 设计模式学习之工厂模式
- 设计模式 学习之工厂方法模式
- 设计模式之简单工厂模式学习
- 计算机世界--操作系统
- Java基础知识点
- leetcode——Add Two Numbers
- 2017 京东 笔试 编程题 解题 爬山
- CSU 1030: 素数槽
- Android开发框架/库学习,设计模式之工厂模式
- shell 学习 — 1
- BTree C 语言实例
- VS2015下解决:error LNK2019: 无法解析的外部符号 __iob_func解决方案
- 连接查询-mysql第五天
- 京东2017校招:4,7幸运数
- GitHub详解(GitHub for Windows)
- HOP: A proxy server to enable arbitrary protocols behind an HTTP proxy http://acehack.org/hop
- 数组中只出现一次得两个数