工厂的作用:
可以自主生产自己的产品 而不在依赖于new()
定义一个moveable接口
Movable.java
package com.fgh.dp.factory; /** * 定义moveable接口 任意具有可以移动特性的类都可以实现该接口 * 比如汽车 飞机等 * @author fgh * */ public interface Moveable { void run(); }
定义一个实现类Car.java
<pre name="code" class="java">package com.fgh.dp.factory; //import java.util.ArrayList; //import java.util.List; /** * 实现moveable接口 */ public class Car implements Moveable { // 单例模式 private static Car car = new Car(); // 多例模式 // private static List<Car> cars = new ArrayList<Car>(); /** * 如果不想让用户自己生产car 就设置成private */ public Car() { } /** * 在这个方法里面可以添加逻辑 判断司机得到车需要的条件 比如身份证 驾照等 * ---又称静态工厂模式 * * @return */ public static Car getInstance() { return car; } public void run() { System.out.println("开着车回老家,路途中。。。。"); } }</pre><pre name="code" class="java">定义一个抽象工厂类 该类可以产生所有实现具有run特性的交通工具</pre>
VehicleFactory.java
package com.fgh.dp.factory; /** * 定义一个抽象工厂类 为所有生产交通工具类的父类 * 使程序可以在某个维度上进行扩展 不仅可以产生新的交通工具 * 而且还可以控制产生新的交通工具的生产 * * @author fgh * */ public abstract class VehicleFactory { abstract Moveable create(); }
定义实现该抽象工厂的实现类 CarFactory.java
package com.fgh.dp.factory; /** * 抽象工厂类的实现类 专门生产汽车的工厂 * @author fgh * */ public class CarFactory extends VehicleFactory{ /** * 重写父类方法 */ @Override public Moveable create() { return new Car(); } }<pre name="code" class="java"></pre><pre name="code" class="java"></pre>测试方法:Test.java
package com.fgh.dp.factory; public class Test { public static void main(String[] args) { /** * 这种方式 司机可以拥有多辆车 通过new 得到 * 如果想要让司机不能自己随便得到的车的话 * 可以通过在方法里 提供一个私有构造方法 实现 这样 * 就不能通过new得到 但是 不能new的话 用户得不到车 * */ // Car c = new Car(); // Car.getInstance().run(); // c.run(); /** * 通过new方法 产生任意的交通工具 */ // Moveable m = new Plane(); // m.run(); /** * 通过工厂的方式 产生任意的交通工具 */ VehicleFactory factory = new CarFactory(); Moveable f = factory.create(); f.run(); } }
运行结果:
开着车回老家,路途中。。。。
生产具体交通类和抽象工厂类关系图
该过程使用了抽象类和接口,关于抽象类的接口什么时候使用的说明:
抽象类和接口的使用:
1、这个概念确实在我们脑子中存在的 就用抽象类 2、如果这个概念仅仅是某个方面的一个特性 比如会飞的、会唱的等 像这样的就设计成接口 3、在不清楚是设计成抽象类还是设计成接口的时候,一般都设计成接口 原因是实现了这个接口之 后 还可以从其他的抽象类继承 更灵活