factory method 模式:模板方法模式+简单工厂模式,简单工厂模式稍微复杂一点的变种;
场景:
- 我们现在要生产的产品有很多种;
- 每种产品的生产过程,都是一些共同的逻辑,但是也有一些是特殊的逻辑;
- 现在要生产出来各种产品;
一般就是在有复杂工厂生产场景的情况下,比如就是需要多种工厂生产不同的产品,但是产品都是类似的,同时不同的工厂有一定的相同逻辑,那么就用这种模式
;
平时在项目中使用相对频率较低;
package com.example.designpattern.factory;
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 {
public void execute() {
System.out.println("产品1的功能逻辑");
}
}
public static class Product2 implements Product {
public void execute() {
System.out.println("产品2的功能逻辑");
}
}
public static class Product3 implements Product {
public void execute() {
System.out.println("产品3的功能逻辑");
}
}
public static abstract class AbstractProductFactory{
public Product createProduct(){
commonCreate();
return specificCreate();
}
private void commonCreate(){
System.out.println("生产产品的通用逻辑...");
}
public abstract Product specificCreate();
}
public static class Product1Factory extends AbstractProductFactory{
public static final Product1Factory instance = new Product1Factory();
public static Product1Factory get(){
return instance;
}
public Product specificCreate() {
System.out.println("生产产品1的特殊逻辑");
return new Product1();
}
}
public static class Product2Factory extends AbstractProductFactory{
public static final Product2Factory instance = new Product2Factory();
public static Product2Factory get(){
return instance;
}
public Product specificCreate() {
System.out.println("生产产品2的特殊逻辑");
return new Product2();
}
}
public static class Product3Factory extends AbstractProductFactory{
public static final Product3Factory instance = new Product3Factory();
public static Product3Factory get(){
return instance;
}
public Product specificCreate() {
System.out.println("生产产品3的特殊逻辑");
return new Product3();
}
}
}