工厂模式
定义车的抽象类,有一个行驶的方法,所有的车都继承这个类
/**
* Car 抽象类
*/
public abstract class Car {
public abstract void run();
}
定义两辆车,奔驰和本田,继承Car 抽象类并实现run()方法
public class BenChi extends Car {
@Override
public void run() {
System.out.println("开着奔驰去泡妞...");
}
}
public class BenTian extends Car {
@Override
public void run() {
System.out.println("开着本田去上班...");
}
}
创建工厂类,负责生成汽车,如果想创建汽车就使用这个类,不用自己去new了
/**
* Car的工厂类,负责生成各种汽车
*/
public class CarFactory {
public static Car createCar(String type){
if("奔驰".equals(type)){
return new BenChi();
}else if("本田".equals(type)){
return new BenTian();
}
return null;
}
}
测试类,想创建BenChi类时,无需 Car 奔驰 = new BenChi() ; 因为创建的过程交给了CarFactory类
public class Test {
public static void main(String[] args) {
Car 奔驰 = CarFactory.createCar("奔驰");
奔驰.run();
Car 本田 = CarFactory.createCar("本田");
本田.run();
}
}
执行输出
开着奔驰去泡妞...
开着本田去上班...
这就是一个工厂模式,但是有一个问题,我想增加一辆QQ车时要修改CarFactory类,这样不太好吧,写好的代码不应该经常修改,所以可以使用工厂方法模式。
工厂方法模式
定义生成车的接口
public interface CarFactory {
public Car createCar();
}
创建生成XX车的工厂类,并实现CarFactory接口
/**
* 生成奔驰的工厂类
*/
public class BenChiFactory implements CarFactory {
@Override
public Car createCar() {
return new BenChi();
}
}
/**
* 生成本田的工厂类
*/
public class BenTianFactory implements CarFactory{
@Override
public Car createCar() {
return new BenTian();
}
}
/**
* 生成QQ的工厂类
*/
public class QQFactory implements CarFactory{
@Override
public Car createCar() {
return new QQ();
}
}
定义车的抽象类,有一个行驶的方法,所有的车都继承这个类
/**
* Car 抽象类
*/
public abstract class Car {
public abstract void run();
}
创建辆车,奔驰,本田,QQ,继承Car 抽象类并实现run()方法
public class BenChi extends Car {
@Override
public void run() {
System.out.println("开着奔驰去泡妞...");
}
}
public class BenTian extends Car {
@Override
public void run() {
System.out.println("开着本田去上班...");
}
}
public class QQ extends Car{
@Override
public void run() {
System.out.println("开着QQ送快递...");
}
}
测试类
public class Test {
public static void main(String[] args) {
CarFactory 奔驰工厂 = new BenChiFactory();
Car 奔驰 = 奔驰工厂.createCar();
奔驰.run();
CarFactory 本田工厂 = new BenTianFactory();
Car 本田 = 本田工厂.createCar();
本田.run();
CarFactory QQ工厂= new QQFactory();
Car qq = QQ工厂.createCar();
qq.run();
}
}
结果
开着奔驰去泡妞...
开着本田去上班...
开着QQ送快递...
以后再新加车时,不需要修改以前写好的代码,只需要新建XXFactory实现CarFactory接口,和创建XX车类继承Car重写run()方法,这样就避免了修改以前的代码可能导致其他问题的发生
抽象工厂
定义抽象工厂接口AbstractFactory有两个方法
public interface AbstractFactory {
public Car createCar();
public Mobile createMobile();
}
定义手机和汽车的抽象类
public abstract class Mobile {
public abstract void call();
}
public abstract class Car {
public abstract void run();
}
建一个生产高帅富的工厂类并实现AbstractFactory接口,这个工厂将生产奔驰车和苹果手机
/**
* 高帅富工厂
*/
public class GaoShuaiFuFactory implements AbstractFactory{
@Override
public Car createCar() {
return new BenChi();
}
@Override
public Mobile createMobile() {
return new Iphone();
}
}
创建苹果手机类Iphone继承Mobile类,重写call()方法
public class Iphone extends Mobile{
@Override
public void call() {
System.out.println("用苹果手机打电话");
}
}
创建奔驰类继承Car类,重写run()方法
public class BenChi extends Car {
@Override
public void run() {
System.out.println("开着奔驰去泡妞...");
}
}
测试类
public class Test {
public static void main(String[] args) {
AbstractFactory abstractFactory = new GaoShuaiFuFactory();
Car car = abstractFactory.createCar();
car.run();
Mobile mobile = abstractFactory.createMobile();
mobile.call();
}
}
执行控制台输出
开着奔驰去泡妞...
用苹果手机打电话
接下来我们把高帅富换成屌丝,屌丝开QQ,用小米手机
/**
* 屌丝工厂
*/
public class DiaoSiFactory implements AbstractFactory{
@Override
public Car createCar() {
return new QQ();
}
@Override
public Mobile createMobile() {
return new XiaoMi();
}
}
创建小米手机类XiaoMi继承Mobile类,重写call()方法
public class XiaoMi extends Mobile{
@Override
public void call() {
System.out.println("用小米手机打电话");
}
}
创建QQ类继承Car类,重写run()方法
public class QQ extends Car{
@Override
public void run() {
System.out.println("开着QQ送快递...");
}
}
测试类,只需要将GaoShuaiFuFactory类换成DiaoSiFactory类就行了,如果使用spring的getbean形式,代码是不需要改的
public class Test {
public static void main(String[] args) {
// AbstractFactory abstractFactory = new GaoShuaiFuFactory();
AbstractFactory abstractFactory = new DiaoSiFactory();
Car car = abstractFactory.createCar();
car.run();
Mobile mobile = abstractFactory.createMobile();
mobile.call();
}
}
控制台输出
开着QQ送快递...
用小米手机打电话