概要

  • 工厂模式属于创建者类型

    简单工厂

  • 工厂类根据传入的参数,判断生产不同的实例对象。

  • 简单工厂每新增一个新的实例类型时,都要修改工厂方法。会使工厂类越来越复杂。

  • 违背了开闭原则(拓展开放,内容封闭)

  1. class Animal {
  2. private String name;
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. }
  10. class Factory {
  11. public static Animal creatAnimal(String type) {
  12. Animal animal = null;
  13. switch (type) {
  14. case "cat":
  15. animal = new Cat();
  16. break;
  17. case "dog":
  18. animal = new Dog();
  19. break;
  20. default:
  21. }
  22. return animal;
  23. }
  24. }
  25. class Dog extends Animal {
  26. public Dog() {
  27. setName("dog");
  28. }
  29. }
  30. class Cat extends Animal {
  31. public Cat() {
  32. setName("cat");
  33. }
  34. }
  35. public class SimpleFactoryDesign {
  36. public static void main(String[] args) {
  37. Animal animal = Factory.creatAnimal("cat");
  38. System.out.println(animal.getName());
  39. animal = Factory.creatAnimal("dog");
  40. System.out.println(animal.getName());
  41. }
  42. }

工厂方法

  • 将工厂类的创建延迟到子类(解决了增加子类直接修改工厂方法)
  1. class Animal {
  2. private String name;
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. }
  10. class Dog extends Animal {
  11. public Dog() {
  12. setName("dog");
  13. }
  14. }
  15. class Cat extends Animal {
  16. public Cat() {
  17. setName("cat");
  18. }
  19. }
  20. abstract class AbstractFactory {
  21. abstract Animal creatAnimal();
  22. public void getName() {
  23. System.out.println(creatAnimal().getName());
  24. }
  25. }
  26. class DogFactory extends AbstractFactory {
  27. @Override
  28. Animal creatAnimal() {
  29. return new Dog();
  30. }
  31. }
  32. class CatFactory extends AbstractFactory {
  33. @Override
  34. Animal creatAnimal() {
  35. return new Cat();
  36. }
  37. }
  38. public class FactoryMethodDesign {
  39. public static void main(String[] args) {
  40. AbstractFactory catFactory = new CatFactory();
  41. AbstractFactory dogFactory = new DogFactory();
  42. catFactory.getName();
  43. dogFactory.getName();
  44. }
  45. }

抽象工厂

  • 工厂生产多类产品
  • 新增产品,要创建对应的工厂
  1. abstract class Animal {
  2. private String name;
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. }
  10. abstract class Plant {
  11. private String name;
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. }
  19. class Dog extends Animal {
  20. public Dog() {
  21. setName("dog");
  22. }
  23. }
  24. class Cat extends Animal {
  25. public Cat() {
  26. setName("cat");
  27. }
  28. }
  29. class Pine extends Plant {
  30. public Pine() {
  31. setName("pine");
  32. }
  33. }
  34. class Cypress extends Plant {
  35. public Cypress() {
  36. setName("cypress");
  37. }
  38. }
  39. abstract class Factory {
  40. abstract Animal creatAnimal();
  41. abstract Plant creatPlant();
  42. }
  43. class Factory1 extends Factory {
  44. @Override
  45. Animal creatAnimal() {
  46. return new Dog();
  47. }
  48. @Override
  49. Plant creatPlant() {
  50. return new Pine();
  51. }
  52. }
  53. class Factory2 extends Factory {
  54. @Override
  55. Animal creatAnimal() {
  56. return new Cat();
  57. }
  58. @Override
  59. Plant creatPlant() {
  60. return new Cypress();
  61. }
  62. }
  63. public class AbstractFactoryDesign {
  64. public static void main(String[] args) {
  65. Factory factory1 = new Factory1();
  66. System.out.println(factory1.creatAnimal().getName());
  67. System.out.println(factory1.creatPlant().getName());
  68. Factory factory2 = new Factory2();
  69. System.out.println(factory2.creatAnimal().getName());
  70. System.out.println(factory2.creatPlant().getName());
  71. }
  72. }

总结

  • 首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
  • 从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。