简单工厂

  • 使用工厂模式的目的是不让程序员自己手动new对象,而是通过工厂去获取一个对象的实例。这种方式的好处是:获取对象实例的程序员无需关心这个实例创建的过程,如果后续实例创建逻辑修改,那么无需改动引用工厂的代码,只需改动工厂中的创建逻辑即可。
  • 简单工厂就是仅仅实现了以上的目的。工厂的思想在Spring中运用的尤为广泛,每次我们@Autowired其实都是在从Spring为我们准备的IOC工厂中取出这个接口的实现类。
  • 简单工厂demo。
  1. public class FactoryPatternDemo {
  2. public static void main(String[] args) {
  3. Product product = ProductFactory.create();
  4. product.execute();
  5. // 如果此时有100个地方都需要获取Product的实例
  6. // 但是此时Product实现类改了
  7. // 我们只要修改一个地方即可,就是ProductFacory中
  8. }
  9. public interface Product {
  10. void execute();
  11. }
  12. // public static class ProductImpl1 implements Product {
  13. //
  14. // public void execute() {
  15. // System.out.print("产品1的功能实现");
  16. // }
  17. //
  18. // }
  19. public static class ProductImpl2 implements Product {
  20. public void execute() {
  21. System.out.print("产品1的功能实现");
  22. }
  23. }
  24. public static class ProductFactory {
  25. public static Product create() {
  26. return new ProductImpl2();
  27. }
  28. }
  29. }

工厂方法

  • 有时候在创建同一类对象时,这些对象难免有一些通用的创建逻辑。如果使用简单工厂实现,这些逻辑就会变成冗余的重复代码。这时就要引入工厂方法模式了。
  • 工厂方法模式可以看做模板+简单工厂的形式。
  • 创建工厂,令子类继承工厂中的通用方法,令子类重载工厂中的特殊抽象方法。
  1. public static abstract class AbstractProductFactory {
  2. public Product createProduct() {
  3. commonCreate();
  4. return specificCreate();
  5. }
  6. private void commonCreate() {
  7. System.out.println("生产产品的通用逻辑,修改");
  8. }
  9. protected abstract Product specificCreate();
  10. }
  • 创建具象的工厂,继承抽象工厂,使自己单例并重载特殊逻辑。
  1. public static class Product1Factory extends AbstractProductFactory {
  2. private static final Product1Factory instance = new Product1Factory();
  3. private Product1Factory() {
  4. }
  5. public static Product1Factory get() {
  6. return instance;
  7. }
  8. @Override
  9. public Product specificCreate() {
  10. System.out.println("生产产品1的特殊逻辑");
  11. return new Product1();
  12. }
  13. }
  14. public static class Product2Factory extends AbstractProductFactory {
  15. private static final Product2Factory instance = new Product2Factory();
  16. private Product2Factory() {
  17. }
  18. public static Product2Factory get() {
  19. return instance;
  20. }
  21. @Override
  22. public Product specificCreate() {
  23. System.out.println("生产产品2的特殊逻辑");
  24. return new Product2();
  25. }
  26. }
  27. public static class Product3Factory extends AbstractProductFactory {
  28. private static final Product3Factory instance = new Product3Factory();
  29. private Product3Factory() {
  30. }
  31. public static Product3Factory get() {
  32. return instance;
  33. }
  34. @Override
  35. public Product specificCreate() {
  36. System.out.println("生产产品3的特殊逻辑");
  37. return new Product3();
  38. }
  39. }
  • 测试
  1. public static void main(String[] args) {
  2. Product product1 = Product1Factory.get().createProduct();
  3. Product product2 = Product2Factory.get().createProduct();
  4. Product product3 = Product3Factory.get().createProduct();
  5. product1.execute();
  6. product2.execute();
  7. product3.execute();
  8. }

抽象工厂

  • 这种工厂模式适用于生产一组一组的产品,但是每组的产品组成也不一定一样。例如一个工厂只生产A和B两种产品,一开始它一直生产A1和B1这两种形式,后来他要生产A2和B3了。此时就可以通过修改工厂来改变产品生产种类。
  • 创建产品种类和产品形式
  1. public interface ProductA {
  2. void execute();
  3. }
  4. public static class ProductA1 implements ProductA {
  5. public void execute() {
  6. System.out.println("产品A1的功能逻辑");
  7. }
  8. }
  9. public static class ProductA2 implements ProductA {
  10. public void execute() {
  11. System.out.println("产品A2的功能逻辑");
  12. }
  13. }
  14. public static class ProductA3 implements ProductA {
  15. public void execute() {
  16. System.out.println("产品A3的功能逻辑");
  17. }
  18. }
  19. public interface ProductB {
  20. void execute();
  21. }
  22. public static class ProductB1 implements ProductB {
  23. public void execute() {
  24. System.out.println("产品B1的功能逻辑");
  25. }
  26. }
  27. public static class ProductB2 implements ProductB {
  28. public void execute() {
  29. System.out.println("产品B2的功能逻辑");
  30. }
  31. }
  32. public static class ProductB3 implements ProductB {
  33. public void execute() {
  34. System.out.println("产品B3的功能逻辑");
  35. }
  36. }
  • 创建工厂接口
  1. /**
  2. * 工厂的职责就是生产A和B两种产品
  3. */
  4. public interface Factory {
  5. ProductA createProductA();
  6. ProductB createProductB();
  7. }
  • 创建各类工厂
  1. public static class Factory1 implements Factory {
  2. private static final Factory1 instance = new Factory1();
  3. private Factory1() {
  4. }
  5. public static Factory get() {
  6. return instance;
  7. }
  8. public ProductA createProductA() {
  9. return new ProductA1();
  10. }
  11. public ProductB createProductB() {
  12. return new ProductB3();
  13. }
  14. }
  15. public static class Factory2 implements Factory {
  16. private static final Factory2 instance = new Factory2();
  17. private Factory2() {
  18. }
  19. public static Factory get() {
  20. return instance;
  21. }
  22. public ProductA createProductA() {
  23. return new ProductA2();
  24. }
  25. public ProductB createProductB() {
  26. return new ProductB2();
  27. }
  28. }
  29. public static class Factory3 implements Factory {
  30. private static final Factory3 instance = new Factory3();
  31. private Factory3() {
  32. }
  33. public static Factory get() {
  34. return instance;
  35. }
  36. public ProductA createProductA() {
  37. return new ProductA3();
  38. }
  39. public ProductB createProductB() {
  40. return new ProductB3();
  41. }
  42. }
  • 测试
  1. public static void main(String[] args) {
  2. // 产品A1+产品B1 -> 产品A1+产品B3
  3. ProductA firstProductA = Factory1.get().createProductA();
  4. ProductB firstProductB = Factory1.get().createProductB();
  5. firstProductA.execute();
  6. firstProductB.execute();
  7. // 产品A2+产品B2
  8. ProductA secondProductA = Factory2.get().createProductA();
  9. ProductB secondProductB = Factory2.get().createProductB();
  10. secondProductA.execute();
  11. secondProductB.execute();
  12. // 产品A3+产品B3
  13. ProductA thirdProductA = Factory3.get().createProductA();
  14. ProductB thirdProductB = Factory3.get().createProductB();
  15. thirdProductA.execute();
  16. thirdProductB.execute();
  17. // 哪怕你有100个地方定义了产品组合,要调整组合的逻辑,只要修改一个工厂就可以了
  18. }