场景: (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 {
@Override
public void execute() {
System.out.println("产品1的功能逻辑");
}
}
public static class Product2 implements Product {
@Override
public void execute() {
System.out.println("产品2的功能逻辑");
}
}
public static class Product3 implements Product {
@Override
public 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 {
@Override
public void execute() {
System.out.println("产品1的功能逻辑");
}
}
public static class Product2 implements Product {
@Override
public void execute() {
System.out.println("产品2的功能逻辑");
}
}
public static class Product3 implements Product {
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public Product specificCreate() {
System.out.println("生产产品3的特殊逻辑");
return new Product3();
}
}
}
3.说明
说实话,这种设计模式算是较为复杂一点的了,适用的是比较复杂的场景了
一般就是在有复杂工厂生产场景的情况下,比如就是需要多种工厂生产不同的产品,但是产品都是类似的,同时不同的工厂有一定的相同逻辑,那么就用这种模式