工厂模式(Factory Pattern):
定义一个用于创建对象的接口,让子类决定将哪一个类实例化,FactoryMethod使一个类的实例化延迟到其子类。(Define an interface for creating anobject, but let subclasses decide which class to instantiate. Factory methodlets a class defer instantiation to subclasses.)
工厂模式,也叫作静态工厂模式,顾名思义,就是用来生产对象的,在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则,如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦
核心本质:
应用场景:
详细分类:
工厂方法模式和简单工厂模式区别: 简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
面向对象设计的基本原则:
简单工厂模式例子:
比如,小明骑自行车去学校,开汽车去旅游,可用简单工厂模式实现:
第一步:建一个交通工具接口,汽车和自行车都实现这个接口
/**
* 交通工具
*/
interface IVehicle {
void run();
}
//汽车
class Car implements IVehicle{
@Override
public void run() {
System.out.println("开汽车去。。。");
}
}
//自行车
class Bicycle implements IVehicle{
@Override
public void run() {
System.out.println("骑自行车去。。。");
}
}
第二步:创建一个车库,判断去选自行车还是选汽车
//车库
public class GarageFactory {
public static IVehicle getVehicle(String type) {
if ("car".equals(type)) {
return new Car();
} else if ("bicycle".equals(type)) {
return new Bicycle();
}
throw new IllegalArgumentException("请输入车类型");
}
}
第三步:测试
public class TestSimpleFactory {
public static void main(String[] args) {
XiaoMing xiaoMing = new XiaoMing();
// 小明骑自行车去学校
IVehicle motorcycle = GarageFactory.getVehicle("bicycle");
xiaoMing.goToSchool(motorcycle);
// 小明开汽车去旅游
IVehicle car = GarageFactory.getVehicle("car");
xiaoMing.travel(car);
}
}
class XiaoMing{
public void goToSchool(IVehicle vehicle){
System.out.println("小明去学校:");
vehicle.run();
}
public void travel(IVehicle vehicle){
System.out.println("小明去旅游:");
vehicle.run();
}
}
简单工厂模式拓展性不好,优秀的java代码是符合“开放-封闭”原则的,也就是说对扩展开发,对修改关闭,如果想骑电动车去上班,在这里就要增加if-else判断。对于这个问题,我们的工厂方法模式就可以解决这个问题。
工厂方法模式例子:
根据上面的例子,如果有车库,则可以按车类型来放置。只需要在上面例子的基础上,再加2步。
第一步:建一个车库接口,汽车和自行车都实现这个接口。
public interface VehicleGarage {
IVehicle getVehicle();
}
//汽车车库
class CarGarage implements VehicleGarage{
@Override
public IVehicle getVehicle() {
return new Car();
}
}
//自行车车库
class BicycleGarage implements VehicleGarage{
@Override
public IVehicle getVehicle() {
return new Bicycle();
}
}
第二步:测试
public class TestFactoryMethod {
public static void main(String[] args) {
XiaoMing xiaoMing = new XiaoMing();
//小明骑自行车去学校
BicycleGarage bicycleGarage = new BicycleGarage();
IVehicle bicycle = bicycleGarage.getVehicle();
xiaoMing.goToSchool(bicycle);
//小明开汽车去旅游
CarGarage carGarage = new CarGarage();
IVehicle car = carGarage.getVehicle();
xiaoMing.travel(car);
}
}
工厂方法模式可以说在你能想到的开源框架源码中必定会使用的一个设计模式,因为开源框架很重要一点就是要有扩展性,而工厂方法模式恰恰具有可扩展性。
如果想了解更多设计模式,可点击:设计模式概述 以及 23种设计模式的介绍