1. 意图:
定义一个实例化的接口,让子类选择实例化哪个工厂类,工厂模式是将创建延迟到子类中
2. 使用场景:
明确知道不同条件下创建不同的实例。
3. 使用方法:
定义抽象类,并继承,让其子类实现工厂接口,并返回一个抽象类。
4. 实例:(快递)
我要向河南邮寄快递,提供了2种快递方式,一种是快速(飞机),一种是慢速(汽车),客户只需要选择一种方式即可,
而不用关心这两种方式是怎么实现的。(同时如果有一天邮寄公司想改变慢速的方式(火车)只需要改变工厂里面实例化方式)
客户端不用做改变,就把影响度改的很低,而且也提高了客户的体验度。
而工厂只需要提供一个接口,用来接收用户提供的方式。
定义一个实例化的接口,让子类选择实例化哪个工厂类,工厂模式是将创建延迟到子类中
2. 使用场景:
明确知道不同条件下创建不同的实例。
3. 使用方法:
定义抽象类,并继承,让其子类实现工厂接口,并返回一个抽象类。
4. 实例:(快递)
我要向河南邮寄快递,提供了2种快递方式,一种是快速(飞机),一种是慢速(汽车),客户只需要选择一种方式即可,
而不用关心这两种方式是怎么实现的。(同时如果有一天邮寄公司想改变慢速的方式(火车)只需要改变工厂里面实例化方式)
客户端不用做改变,就把影响度改的很低,而且也提高了客户的体验度。
而工厂只需要提供一个接口,用来接收用户提供的方式。
一、首先定义一个工厂接口,用来提供不同的运输方式:
package ray.factory;
import ray.bean.Car;
import ray.bean.Plane;
import ray.bean.Traffic;
import ray.tool.Types;
public class Factory {
private static Traffic traffic = null;//定义一个快递方式的抽象类
//提供一个接口定义传输方式
//common: 代表选择的邮递方式为普通邮
//special: 代表选择的方式为加急件
public static int tansWay(Types type){
if(type == Types.special){
traffic = new Plane();
} else if(type == Types.common){
traffic = new Car();
}
traffic.transport();
return traffic.getDays();
}
}
二、分别为不同的运输方式实例化对象
定义抽象类:
package ray.bean;
public abstract class Traffic {
//定义交通路线
public abstract String getPath();
//返回路上用的天数
public abstract int getDays();
public final String transport(){ //返回快递是否到达
System.out.println("通过的路线为:" + getPath());
int days = getDays();
System.out.println("此次快递话费的时间为:" + days);
return "Succ";
}
}
定义实现类:
package ray.bean;
public abstract class Traffic {
//定义交通路线
public abstract String getPath();
//返回路上用的天数
public abstract int getDays();
public final String transport(){ //返回快递是否到达
System.out.println("通过的路线为:" + getPath());
int days = getDays();
System.out.println("此次快递话费的时间为:" + days);
return "Succ";
}
}
package ray.bean;
public class Car extends Traffic{
@Override
public String getPath() {
return "北京--新乡--郑州--鹤壁--南阳";
}
@Override
public int getDays() {
return 10;
}
}
这里提供一个枚举类型来定义用户可以选择的运输方式:
package ray.tool;
//定义用户选择邮递方式的枚举类型
public enum Types {
common, special
}
三、编写测试类:
package ray.test;
import ray.factory.Factory;
import ray.tool.Types;
public class Test {
public static void main(String[] args) {
Factory.tansWay(Types.common);
System.out.println("===----------");
Factory.tansWay(Types.special);
}
}
四、查看输出结果:
通过的路线为:北京--新乡--郑州--鹤壁--南阳
此次快递话费的时间为:10
===----------
通过的路线为:北京--南阳
此次快递话费的时间为:1