模板方法模式 + 简单工厂模式,简单工厂模式稍微复杂一点的变种
场景:
(1)我们现在要生产的产品有多种
(2)每种产品的生产过程,都有一些是共同的逻辑,但是也有一些是特殊的逻辑
如果不使用设计模式
在工厂类中,有生产产品的相同的通用逻辑,没有抽取出来,直接复制粘贴放多个工厂里了
如果那段通用逻辑要修改
就需要很麻烦到所有工厂中去修改代码;可能会忘记修改某个工厂的代码
/**
* 工厂方法模式
*/
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();
}
}
}