工厂方法模式其中包含两种,这里就写在一起了,包含普通工厂模式和抽象方法模式,工厂模式可以在一定程度上减少coding,只能是一定程度上.因为我们在使用中往往会增加coding.它最明显的好处是代码隔离,复用,解耦.可以理解为我们将复杂的对象的实例化放在工厂模式中进行处理,在使用时工厂模式透明,我们不需要去关心内部如何实现.而解耦则是我们在进行编程时不会进行强制的指向,即通过工厂模式作为统一入口来获取实例即可.作者是个二吊子,如果描述有误请指出.
工厂模式的种类
本文描述三种,含简单工厂模式,普通工厂模式,抽象工厂模式.需要注意简单工厂模式未列入二十三种设计模式中
简单工厂模式(非23种之一,算不上)
uml图
我们产品抽象是车-Car,其中实现有燃气车GasCar,燃油车OilCar两种.实现了Car中的行为.SimpleFactory为工厂类,提供了获取实例的方法,通过参数进行控制获取的具体实例.以下为代码
/**
* @Description: 抽象类,抽象了产品的行为.这里使用了抽象类,用接口也可以,并无不妥,只是可能受到单根继承的影响,此处为简单示例
* @Author: gaofan
* @Date: 2020/3/20 10:35
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public abstract class Car {
// 运行
public abstract void run();
// 开窗
public abstract void openWindow();
// 停车
public abstract void stop();
}
/**
* @Description: 继承了Car,实现了其行为
* @Author: gaofan
* @Date: 2020/3/20 10:40
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class GasCar extends Car {
public void run() {
System.out.println("燃气车运行了...");
}
public void openWindow() {
System.out.println("燃气车开窗了...");
}
public void stop() {
System.out.println("燃气车停止了...");
}
}
/**
* @Description: 继承了Car,实现了其行为
* @Author: gaofan
* @Date: 2020/3/20 10:39
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class OilCar extends Car{
public void run() {
System.out.println("燃油车运行了...");
}
public void openWindow() {
System.out.println("燃油车开窗了...");
}
public void stop() {
System.out.println("燃油车停止了...");
}
}
/**
* @Description: 简单工厂或者叫静态工厂模式
* @Author: gaofan
* @Date: 2020/3/20 11:04
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class SimpleFactory {
public static Car getCar(String car) {
if ("gas".equals(car)) {
return new GasCar();
} else if ("oil".equals(car)) {
return new OilCar();
} else {
return null;
}
}
}
类型: 简单工厂模式
原理: 以入参来限定工厂方法返回类型,使用工厂模式可以减少代码维护量.但是这里会出现问题,我们在新增产品时就必须要改动工厂类并新增实体.就违反了开闭原则了.不建议使用
普通工厂模式
为每一个产品构造一个工厂类,用来创建,普通工厂模式是创造一种产品.
uml图
为每一个产品提供一个工厂类.使用时根据多态.
/**
* @Description: 抽象类
* @Author: gaofan
* @Date: 2020/3/20 10:35
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public abstract class Car {
// 运行
public abstract void run();
// 开窗
public abstract void openWindow();
// 停车
public abstract void stop();
}
/**
* @Description: 燃油车
* @Author: gaofan
* @Date: 2020/3/20 10:39
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class OilCar extends Car{
public void run() {
System.out.println("燃油车运行了...");
}
public void openWindow() {
System.out.println("燃油车开窗了...");
}
public void stop() {
System.out.println("燃油车停止了...");
}
}
/**
* @Description: 燃气车
* @Author: gaofan
* @Date: 2020/3/20 10:40
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class GasCar extends Car {
public void run() {
System.out.println("燃气车运行了...");
}
public void openWindow() {
System.out.println("燃气车开窗了...");
}
public void stop() {
System.out.println("燃气车停止了...");
}
}
/**
* @Description: 工厂根类
* @Author: gaofan
* @Date: 2020/3/20 16:20
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public interface Factory {
Car create();
}
/**
* @Description: 燃气车工厂类
* @Author: gaofan
* @Date: 2020/3/20 16:20
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class GasCarFactory implements Factory {
public Car create() {
return new GasCar();
}
}
/**
* @Description: 燃油车工厂类
* @Author: gaofan
* @Date: 2020/3/20 16:21
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class OilCarFactory implements Factory {
public Car create() {
return new OilCar();
}
}
类型: 普通工厂模式
原理: 为每一个产品创建一个工厂类,解决了简单工厂中违背开闭原则的情况.我们在后续如果需要新增一个产品,只需要创建产品类即工厂类即可.
缺点: 编码会增多
抽象工厂模式
普通工厂模式是创建一种产品,而抽象工厂则是一类,进行了归集.可以理解为产品簇使用场景.
便于我们在复杂的产品层级中使用,新增一类产品时,我们只需要继承工厂类,新增产品即可.这里需要注意的是,如果工厂抽象类中的方法不够通用则可以下沉,如果还有其他通用方法也可以提升到抽象类中.灵活使用
/**
* @Description: 抽象类,这是整体的抽象,最基本的抽象
* @Author: gaofan
* @Date: 2020/3/20 10:35
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public abstract class Car {
// 运行
public abstract void run();
// 开窗
public abstract void openWindow();
// 停车
public abstract void stop();
}
/**
* @Description: 载物燃气车
* @Author: gaofan
* @Date: 2020/3/20 10:40
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class CargoGasCar extends Car {
public void run() {
System.out.println("载物燃气车运行了...");
}
public void openWindow() {
System.out.println("载物燃气车开窗了...");
}
public void stop() {
System.out.println("载物燃气车停止了...");
}
}
/**
* @Description: 载物燃油车
*
* @Author: gaofan
* @Date: 2020/3/20 10:39
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class CargoOilCar extends Car {
public void run() {
System.out.println("载物燃油车运行了...");
}
public void openWindow() {
System.out.println("载物燃油车开窗了...");
}
public void stop() {
System.out.println("载物燃油车停止了...");
}
}
/**
* @Description: 载人燃气车
* @Author: gaofan
* @Date: 2020/3/20 10:40
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class MannedGasCar extends Car {
public void run() {
System.out.println("载人燃气车运行了...");
}
public void openWindow() {
System.out.println("载人燃气车开窗了...");
}
public void stop() {
System.out.println("载人燃气车停止了...");
}
}
/**
* @Description: 载人燃油车
* @Author: gaofan
* @Date: 2020/3/20 10:39
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class MannedOilCar extends Car {
public void run() {
System.out.println("载人燃油车运行了...");
}
public void openWindow() {
System.out.println("载人燃油车开窗了...");
}
public void stop() {
System.out.println("载人燃油车停止了...");
}
}
/**
* @Description: TODO
* @Author: gaofan
* @Date: 2020/3/20 14:08
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public interface CarFactory {
// 创建载物车
Car createCarGoCar();
// 创建载人车
Car createMannedCar();
}
/**
* @Description: 燃气车工厂子类
* @Author: gaofan
* @Date: 2020/3/20 14:08
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class GasCarFactory implements CarFactory{
public Car createCarGoCar() {
return new CargoGasCar();
}
public Car createMannedCar() {
return new MannedGasCar();
}
}
/**
* @Description: 燃油车工厂子类
* @Author: gaofan
* @Date: 2020/3/20 14:08
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class OilCarFactory implements CarFactory {
public Car createCarGoCar() {
return new CargoOilCar();
}
public Car createMannedCar() {
return new MannedOilCar();
}
}
类型: 抽象工厂模式
原理: 用于一类产品而非一个,通过抽象再抽象的思想,创建产品的抽象和工厂的抽象
缺点: 无
本文借鉴尚硅谷Java设计模式,韩顺平图解java,传送门