在23种设计模式有工厂模式和抽象工厂模式。其实我觉得没必要分开,可能是为了凑数。我在这篇博客就一起写了。工厂模式属于创建型模式不知道23种设计模式是如何分类的,去看我的单例模式讲解,那里面讲解了
- 工厂模式其中有分类如下:
- 简单工厂
- 工厂方法
- 抽象工厂
- 工厂模式:一个工厂对应一类产品,解决重复创建对象问题,直白点就是不用new,全靠这个工厂给我们对象。目的:维护对象方便,解耦合
- 熟悉设计模式7大原则就知道工厂模式就是的最最核心就是依赖倒置原则:高层模块不应该依赖低层模块,它们都应该依赖抽象接口。抽象接口不应该依赖具体实现,具体实现应该依赖抽象接口。
1:需求
-
为了贴近现实,就拿造车这个例子:我有一个詹姆斯车行,可以卖各种车
-
以代码方式展现,传统写法:
/** * 普通实现,所有的类都都写在内部类中最外面的相当于容器,方便观看 * @author xxl * @date 2023/4/21 */ public class Original { public static void main(String[] args) { JamesCarStone jamesCarStone = new JamesCarStone(); System.out.println(jamesCarStone.sellingCar("汽车")); System.out.println(jamesCarStone.sellingCar("跑车")); System.out.println(jamesCarStone.sellingCar("新能源车")); } /** * 核心类 */ public abstract static class CarStone{ abstract String type(); } public static class NewEnergyVehicles extends CarStone{ @Override String type() { return "新能源车"; } } public static class Automobile extends CarStone{ @Override String type() { return "汽车"; } } public static class JamesCarStone{ public static final String NEW_ENERGY_VEHICLES = "新能源车"; public static final String AUTOMOBILE = "汽车"; public String sellingCar(String carName){ CarStone carStone = null; switch (carName) { case NEW_ENERGY_VEHICLES -> carStone = new NewEnergyVehicles(); case AUTOMOBILE -> carStone = new Automobile(); default -> carStone = null; } return carStone == null ? carName + "暂时不在售" : "正在出售" + carStone.type(); } } }
UML类图
2:简单工厂
-
也叫静态工厂,就是通过静态方法返回一个工厂对象
-
核心思想:**创建对象 **
/** * 简单工厂 * @author xxl * @date 2023/4/21 */ public class SimpleFactoryPattern { public static void main(String[] args) { JamesCarStone jamesCarStone = new JamesCarStone(new CarStone()); TomCarStone tomCarStone = new TomCarStone(new CarStone()); System.out.println(jamesCarStone.sellingCar("跑车")); System.out.println(jamesCarStone.sellingCar("卡车")); System.out.println(tomCarStone.sellingCar("新能源车")); System.out.println(tomCarStone.sellingCar("汽车")); } public abstract static class Car{ abstract String type(); } public static class NewEnergyVehicles extends Car { @Override String type() { return "新能源车"; } } public static class Automobile extends Car { @Override String type() { return "汽车"; } } public static class SportsCar extends Car { @Override String type() { return "跑车"; } } /** * 核心类 */ public static class CarStone { public static final String SPORTS_CAR = "跑车"; public static final String AUTOMOBILE = "汽车"; public static final String NEW_ENERGY_VEHICLES = "新能源车"; public String queryCar(String carName){ Car carStone = null; switch (carName) { case NEW_ENERGY_VEHICLES -> carStone = new NewEnergyVehicles(); case AUTOMOBILE -> carStone = new Automobile(); case SPORTS_CAR -> carStone = new SportsCar(); default -> carStone = null; } return carStone == null ? carName + "暂时不在售" : "正在出售" + carStone.type(); } } public static class JamesCarStone{ CarStone carStone = null; public JamesCarStone(CarStone carStone) { this.carStone = carStone; } public String sellingCar(String carName){ return carStone.queryCar(carName); } } public static class TomCarStone{ CarStone carStone = null; public TomCarStone(CarStone carStone) { this.carStone = carStone; } public String sellingCar(String carName){ return carStone.queryCar(carName); } } }
UML类图
3:工厂方法
-
核心思想是:对象的实例化在子类中
/** * 工厂方法类 * @author xxl * @date 2023/4/21 */ public class FactoryMethod { public static void main(String[] args) { JamesCarStone jamesCarStone = new JamesCarStone(new NewEnergyVehiclesCarFactory()); TomCarStone tomCarStone = new TomCarStone(new AutomobileCarFactory()); System.out.println(jamesCarStone.sellingCar("特斯拉")); System.out.println(jamesCarStone.sellingCar("卡车")); System.out.println(tomCarStone.sellingCar("宝马")); System.out.println(tomCarStone.sellingCar("汽车")); } public interface Car { String type(); } public static class BYD implements Car{ @Override public String type() { return "比亚迪"; } } public static class Tesia implements Car{ @Override public String type() { return "特斯拉"; } } public static class BWM implements Car{ @Override public String type() { return "宝马"; } } public static class Lamborghini implements Car{ @Override public String type() { return "兰博基尼"; } } public static class NewEnergyVehiclesCarFactory extends CarStone{ @Override public String queryCar(String carName) { Car car = null; if ("特斯拉".equals(carName)) { car = new Tesia(); }else if ("比亚迪".equals(carName)){ car = new BYD(); } return car == null ? carName+"当前品牌不在出售":"正在出售:"+car.type(); } } public static class AutomobileCarFactory extends CarStone{ @Override public String queryCar(String carName) { Car car = null; if ("宝马".equals(carName)) { car = new BWM(); } return car == null ? carName+"当前品牌不在出售":"正在出售:"+car.type(); } } public static class SportsCarFactory extends CarStone{ @Override public String queryCar(String carName) { Car car = null; if ("兰博基尼".equals(carName)) { car = new Lamborghini(); } return car == null ? carName+"当前品牌不在出售":"正在出售:"+car.type(); } } public static abstract class CarStone{ public abstract String queryCar(String carName); } public static class JamesCarStone{ CarStone carStone = null; public JamesCarStone(CarStone carStone) { this.carStone = carStone; } public String sellingCar(String carName){ return carStone.queryCar(carName); } } public static class TomCarStone{ CarStone carStone = null; public TomCarStone(CarStone carStone) { this.carStone = carStone; } public String sellingCar(String carName){ return carStone.queryCar(carName); } } }
UML图
4:抽象工厂
-
**核心思想:**通过定义一个接口(抽象工厂),所有的小工厂去实现这个接口。通过这个接口就可以返回各种小工厂
-
抽象工厂模式有两层:
- 抽象工厂
- 工厂子类
package src.java_23_design_modes.creationmode.FactoryPattern; /** * 抽象工厂 * @author xxl * @date 2023/4/21 */ public class AbstractFactory { public static void main(String[] args) { JamesCarStone jamesCarStone = new JamesCarStone(new CarStone()); TomCarStone tomCarStone = new TomCarStone(new CarStone()); System.out.println(jamesCarStone.sellingCar("特斯拉")); System.out.println(jamesCarStone.sellingCar("卡车")); System.out.println(tomCarStone.sellingCar("宝马")); System.out.println(tomCarStone.sellingCar("汽车")); } public interface Car{String type();} public interface CarFactory{ Car createCar(String carName); String get(); } public static class BYD implements Car { @Override public String type() { return "比亚迪"; } } public static class Tesia implements Car { @Override public String type() { return "特斯拉"; } } public static class BWM implements Car { @Override public String type() { return "宝马"; } } public static class Lamborghini implements Car { @Override public String type() { return "兰博基尼"; } } public static class NewEnergyVehiclesCarFactory implements CarFactory { String batteryVariety; public void setBatteryVariety(String batteryVariety) { this.batteryVariety = batteryVariety; } @Override public Car createCar(String carName) { Car car = null; if ("特斯拉".equals(carName)) { car = new Tesia(); setBatteryVariety("电池型号:18650 型钴酸锂离子电池"); } else if ("比亚迪".equals(carName)) { car = new BYD(); setBatteryVariety("电池型号:LFP(磷酸铁锂)电池"); } return car; } @Override public String get() { return batteryVariety; } } public static class AutomobileCarFactory implements CarFactory { String gasolineModel; public void setGasolineModel(String gasolineModel) { this.gasolineModel = gasolineModel; } @Override public Car createCar(String carName) { Car car = null; if ("宝马".equals(carName)) { car = new BWM(); setGasolineModel("汽油种类:92"); } return car; } @Override public String get() { return gasolineModel; } } public static class SportsCarFactory implements CarFactory { String engineModel; public void setEngineModel(String engineModel) { this.engineModel = engineModel; } @Override public Car createCar(String carName) { Car car = null; if ("兰博基尼".equals(carName)) { car = new Lamborghini(); setEngineModel("V12发动机"); } return car; } @Override public String get() { return engineModel; } } public static class CarStone{ public String queryCar(String carName){ CarFactory automobileCarFactory = getAutomobileCarFactory(); CarFactory newEnergyVehiclesCarFactory = getNewEnergyVehiclesCarFactory(); CarFactory sportsCarFactory = getSportsCarFactory(); Car car1 = automobileCarFactory.createCar(carName); Car car2 = newEnergyVehiclesCarFactory.createCar(carName); Car car3 = sportsCarFactory.createCar(carName); if (car1 != null) { return "正在出售"+car1.type()+automobileCarFactory.get(); } if (car2 != null) { return "正在出售"+car2.type()+newEnergyVehiclesCarFactory.get(); } if (car3 != null) { return "正在出售"+car3.type()+sportsCarFactory.get(); } return carName+"此车不在出售"; } private CarFactory getAutomobileCarFactory() { return new AutomobileCarFactory(); } private CarFactory getNewEnergyVehiclesCarFactory() { return new NewEnergyVehiclesCarFactory(); } private CarFactory getSportsCarFactory() { return new SportsCarFactory(); } } public static class JamesCarStone{ CarStone carStone = null; public JamesCarStone(CarStone carStone) { this.carStone = carStone; } public String sellingCar(String carName){ return carStone.queryCar(carName); } } public static class TomCarStone{ CarStone carStone = null; public TomCarStone(CarStone carStone) { this.carStone = carStone; } public String sellingCar(String carName){ return carStone.queryCar(carName); } } }
UML类图
5:总结
- 简单工厂 --> 工厂方法 --> 抽象工厂,从以上案例还不难看出越到后面类与类之间越来越复杂,用的模式也越来越难懂。就是说设计一个软件,初期就需要考虑它的架构和扩展性,不是说一上来就用最难的技术。而是根据情况选择,往往一个好的软件扩展性肯定不差