简单工厂
- 使用工厂模式的目的是不让程序员自己手动new对象,而是通过工厂去获取一个对象的实例。这种方式的好处是:获取对象实例的程序员无需关心这个实例创建的过程,如果后续实例创建逻辑修改,那么无需改动引用工厂的代码,只需改动工厂中的创建逻辑即可。
- 简单工厂就是仅仅实现了以上的目的。工厂的思想在Spring中运用的尤为广泛,每次我们
@Autowired其实都是在从Spring为我们准备的IOC工厂中取出这个接口的实现类。 - 简单工厂demo。
public class FactoryPatternDemo { public static void main(String[] args) { Product product = ProductFactory.create(); product.execute(); // 如果此时有100个地方都需要获取Product的实例 // 但是此时Product实现类改了 // 我们只要修改一个地方即可,就是ProductFacory中 } public interface Product { void execute(); }// public static class ProductImpl1 implements Product {//// public void execute() {// System.out.print("产品1的功能实现"); // }// // } public static class ProductImpl2 implements Product { public void execute() { System.out.print("产品1的功能实现"); } } public static class ProductFactory { public static Product create() { return new ProductImpl2(); } }}
工厂方法
- 有时候在创建同一类对象时,这些对象难免有一些通用的创建逻辑。如果使用简单工厂实现,这些逻辑就会变成冗余的重复代码。这时就要引入工厂方法模式了。
- 工厂方法模式可以看做模板+简单工厂的形式。
- 创建工厂,令子类继承工厂中的通用方法,令子类重载工厂中的特殊抽象方法。
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(); } }
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(); }
抽象工厂
- 这种工厂模式适用于生产一组一组的产品,但是每组的产品组成也不一定一样。例如一个工厂只生产A和B两种产品,一开始它一直生产A1和B1这两种形式,后来他要生产A2和B3了。此时就可以通过修改工厂来改变产品生产种类。
- 创建产品种类和产品形式
public interface ProductA { void execute(); } public static class ProductA1 implements ProductA { public void execute() { System.out.println("产品A1的功能逻辑"); } } public static class ProductA2 implements ProductA { public void execute() { System.out.println("产品A2的功能逻辑"); } } public static class ProductA3 implements ProductA { public void execute() { System.out.println("产品A3的功能逻辑"); } } public interface ProductB { void execute(); } public static class ProductB1 implements ProductB { public void execute() { System.out.println("产品B1的功能逻辑"); } } public static class ProductB2 implements ProductB { public void execute() { System.out.println("产品B2的功能逻辑"); } } public static class ProductB3 implements ProductB { public void execute() { System.out.println("产品B3的功能逻辑"); } }
/** * 工厂的职责就是生产A和B两种产品 */ 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; } public ProductA createProductA() { return new ProductA1(); } public 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; } public ProductA createProductA() { return new ProductA2(); } public 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; } public ProductA createProductA() { return new ProductA3(); } public ProductB createProductB() { return new ProductB3(); } }
public static void main(String[] args) { // 产品A1+产品B1 -> 产品A1+产品B3 ProductA firstProductA = Factory1.get().createProductA(); ProductB firstProductB = Factory1.get().createProductB(); firstProductA.execute(); firstProductB.execute(); // 产品A2+产品B2 ProductA secondProductA = Factory2.get().createProductA(); ProductB secondProductB = Factory2.get().createProductB(); secondProductA.execute(); secondProductB.execute(); // 产品A3+产品B3 ProductA thirdProductA = Factory3.get().createProductA(); ProductB thirdProductB = Factory3.get().createProductB(); thirdProductA.execute(); thirdProductB.execute(); // 哪怕你有100个地方定义了产品组合,要调整组合的逻辑,只要修改一个工厂就可以了 }