场景: (1)就是我们现在要生产的不是一个一个产品,而一个一个的产品组合 (2)比如说我们有产品ABC,现在第一种产品组合是A+B,第二种产品组合是B+C,第三种产品组合是A+C (3)就是要对工厂模式进行进一步的增强
1.常规
package com.example.demo.pattern.factory;/*** @author chenchao* @date 2021/11/9*/public class WithoutAbstractFactoryPatternDemo {public static void main(String[] args) {// 我们现在要创建产品A1+产品B1的组合// ProductA productA1 = new ProductA1();// ProductB productB1 = new ProductB1();//// productA1.execute();// productB1.execute();// 变成产品A1+产品B3的组合ProductA productA1 = new ProductA1();ProductB otherProductB3 = new ProductB3();productA1.execute();otherProductB3.execute();// 问题来了,调整产品组合的这个行为,如果你手动创建产品组合的代码,有100个地方,A1+B1// 一旦要调整,就是要对100个地方的代码,手动一点一点的去修改,组合的逻辑// 不可维护,不可扩展// 我们现在要创建产品A2+产品B2的组合ProductA productA2 = new ProductA2();ProductB productB2 = new ProductB2();productA2.execute();productB2.execute();// 我们现在要创建产品A3+产品B3的组合ProductA productA3 = new ProductA3();ProductB productB3 = new ProductB3();productA3.execute();productB3.execute();}public interface ProductA {void execute();}public static class ProductA1 implements ProductA {@Overridepublic void execute() {System.out.println("产品A1的功能逻辑");}}public static class ProductA2 implements ProductA {@Overridepublic void execute() {System.out.println("产品A2的功能逻辑");}}public static class ProductA3 implements ProductA {@Overridepublic void execute() {System.out.println("产品A3的功能逻辑");}}public interface ProductB {void execute();}public static class ProductB1 implements ProductB {@Overridepublic void execute() {System.out.println("产品B1的功能逻辑");}}public static class ProductB2 implements ProductB {@Overridepublic void execute() {System.out.println("产品B2的功能逻辑");}}public static class ProductB3 implements ProductB {@Overridepublic void execute() {System.out.println("产品B3的功能逻辑");}}}
2.抽象工程模式
package com.example.demo.pattern.factory;/*** @author chenchao* @date 2021/11/9*/public class AbstractFactoryPatternDemo {public static void main(String[] args) {// 产品A1+产品B1 -> 产品A1+产品B3ProductA firstProductA = Factory1.get().createProductA();ProductB firstProductB = Factory1.get().createProductB();firstProductA.execute();firstProductB.execute();// 产品A2+产品B2ProductA secondProductA = Factory2.get().createProductA();ProductB secondProductB = Factory2.get().createProductB();secondProductA.execute();secondProductB.execute();// 产品A3+产品B3ProductA thirdProductA = Factory3.get().createProductA();ProductB thirdProductB = Factory3.get().createProductB();thirdProductA.execute();thirdProductB.execute();// 哪怕你有100个地方定义了产品组合,要调整组合的逻辑,只要修改一个工厂就可以了}public interface ProductA {void execute();}public static class ProductA1 implements ProductA {@Overridepublic void execute() {System.out.println("产品A1的功能逻辑");}}public static class ProductA2 implements ProductA {@Overridepublic void execute() {System.out.println("产品A2的功能逻辑");}}public static class ProductA3 implements ProductA {@Overridepublic void execute() {System.out.println("产品A3的功能逻辑");}}public interface ProductB {void execute();}public static class ProductB1 implements ProductB {@Overridepublic void execute() {System.out.println("产品B1的功能逻辑");}}public static class ProductB2 implements ProductB {@Overridepublic void execute() {System.out.println("产品B2的功能逻辑");}}public static class ProductB3 implements ProductB {@Overridepublic void execute() {System.out.println("产品B3的功能逻辑");}}public interface Factory {ProductA createProductA();ProductB createProductB();}public static class Factory1 implements Factory {private static final Factory1 instance = new Factory1();private Factory1() {}public static Factory get() {return instance;}@Overridepublic ProductA createProductA() {return new ProductA1();}@Overridepublic ProductB createProductB() {return new ProductB3();}}public static class Factory2 implements Factory {private static final Factory2 instance = new Factory2();private Factory2() {}public static Factory get() {return instance;}@Overridepublic ProductA createProductA() {return new ProductA2();}@Overridepublic ProductB createProductB() {return new ProductB2();}}public static class Factory3 implements Factory {private static final Factory3 instance = new Factory3();private Factory3() {}public static Factory get() {return instance;}@Overridepublic ProductA createProductA() {return new ProductA3();}@Overridepublic ProductB createProductB() {return new ProductB3();}}}
3.说明
这种模式就更复杂了,在实际开发场景中,更加少见了。因为其核心思想是,如果需要一个工厂,这个工厂可以生产出相关联的一批产品,然后不同的工厂实现,会生产出一批不同的产品组合。
