场景: (1)我们现在要生产的产品有多种 (2)每种产品的生产过程,都有一些是共同的逻辑,但是也有一些是特殊的逻辑 (3)现在要生产出来各种产品
1.常规
package com.example.demo.pattern.factory;/*** @author chenchao*/public class WithoutFactoryMethodPatternDemo {public static void main(String[] args) {Product product1 = Product1Factory.createProduct();Product product2 = Product2Factory.createProduct();Product product3 = Product3Factory.createProduct();product1.execute();product2.execute();product3.execute();// 问题在哪儿?// 跟模板方法模式的问题一模一样// 就是多个工厂类中,有生产产品的相同的通用逻辑,没有抽取出来,直接复制粘贴放多个工厂里了// 如果那段通用逻辑要修改// 就需要很麻烦到所有工厂中去修改代码;可能会忘记修改某个工厂的代码}public interface Product {void execute();}public static class Product1 implements Product {@Overridepublic void execute() {System.out.println("产品1的功能逻辑");}}public static class Product2 implements Product {@Overridepublic void execute() {System.out.println("产品2的功能逻辑");}}public static class Product3 implements Product {@Overridepublic void execute() {System.out.println("产品3的功能逻辑");}}public static class Product1Factory {public static Product createProduct() {System.out.println("生产产品的通用逻辑,修改");System.out.println("生产产品1的特殊逻辑");return new Product1();}}public static class Product2Factory {public static Product createProduct() {System.out.println("生产产品的通用逻辑,修改");System.out.println("生产产品2的特殊逻辑");return new Product2();}}public static class Product3Factory {public static Product createProduct() {System.out.println("生产产品的通用逻辑");System.out.println("生产产品3的特殊逻辑");return new Product3();}}}
2.工厂方法模式
package com.example.demo.pattern.factory;/*** @author chenchao* @date 2021/11/8*/public class FactoryMethodPatternDemo {public static void main(String[] args) {Product product1 = Product1Factory.get().createProduct();Product product2 = Product2Factory.get().createProduct();Product product3 = Product3Factory.get().createProduct();product1.execute();product2.execute();product3.execute();}public interface Product {void execute();}public static class Product1 implements Product {@Overridepublic void execute() {System.out.println("产品1的功能逻辑");}}public static class Product2 implements Product {@Overridepublic void execute() {System.out.println("产品2的功能逻辑");}}public static class Product3 implements Product {@Overridepublic void execute() {System.out.println("产品3的功能逻辑");}}public static abstract class AbstractProductFactory {public Product createProduct() {commonCreate();return specificCreate();}private void commonCreate() {System.out.println("生产产品的通用逻辑,修改");}protected abstract Product specificCreate();}public static class Product1Factory extends AbstractProductFactory {private static final Product1Factory instance = new Product1Factory();private Product1Factory() {}public static Product1Factory get() {return instance;}@Overridepublic Product specificCreate() {System.out.println("生产产品1的特殊逻辑");return new Product1();}}public static class Product2Factory extends AbstractProductFactory {private static final Product2Factory instance = new Product2Factory();private Product2Factory() {}public static Product2Factory get() {return instance;}@Overridepublic Product specificCreate() {System.out.println("生产产品2的特殊逻辑");return new Product2();}}public static class Product3Factory extends AbstractProductFactory {private static final Product3Factory instance = new Product3Factory();private Product3Factory() {}public static Product3Factory get() {return instance;}@Overridepublic Product specificCreate() {System.out.println("生产产品3的特殊逻辑");return new Product3();}}}
3.说明
说实话,这种设计模式算是较为复杂一点的了,适用的是比较复杂的场景了
一般就是在有复杂工厂生产场景的情况下,比如就是需要多种工厂生产不同的产品,但是产品都是类似的,同时不同的工厂有一定的相同逻辑,那么就用这种模式
