工厂模式- 2020-11-21 16:25- 工厂模式: 设计模式,工厂模式


理论上 任何可以生产对象或者方法的类 都可以叫做工厂类

静态工厂

demo

模型类

  1. /**
  2. * 动物类
  3. *
  4. * @author Bai
  5. * @date 2020/11/21 15:51
  6. */
  7. public interface Animal {
  8. void eat();
  9. }
  1. /**
  2. * 猫类
  3. *
  4. * @author Bai
  5. * @date 2020/11/21 15:51
  6. */
  7. public class Cat implements Animal {
  8. @Override
  9. public void eat() {
  10. System.out.println("猫吃鱼");
  11. }
  12. }
  1. /**
  2. * 狗类
  3. *
  4. * @author Bai
  5. * @date 2020/11/21 15:52
  6. */
  7. public class Dog implements Animal {
  8. @Override
  9. public void eat() {
  10. System.out.println("狗啃骨头");
  11. }
  12. }
  1. /**
  2. * @author Bai
  3. * @date 2020/11/21 15:52
  4. */
  5. public class Sheep implements Animal {
  6. @Override
  7. public void eat() {
  8. System.out.println("羊吃草");
  9. }
  10. }

工厂类

  1. /**
  2. * 简单工厂类
  3. *
  4. * @author Bai
  5. * @date 2020/11/21 16:03
  6. */
  7. public class SimpleFactory {
  8. public Animal create(String className) {
  9. if (className.equals("Cat")) {
  10. return new Cat();
  11. } else if (className.equals("Dog")) {
  12. return new Dog();
  13. } else if (className.equals("Sheep")) {
  14. return new Sheep();
  15. }
  16. return null;
  17. }
  18. }

测试

  1. @Test
  2. public void simpleFactoryTest() {
  3. SimpleFactory simpleFactory = new SimpleFactory();
  4. simpleFactory.create("Cat").eat();
  5. simpleFactory.create("Dog").eat();
  6. simpleFactory.create("Sheep").eat();
  7. }

image.png

优点

1.使用者不需要感知 如何创建对象,屏蔽创建过程
2.如果新增初动物外的其他产品,例如想增加植物,只需要新增模型类和对应的工厂类即可
3.只需要知道想要的类名即可

缺点

每次增加一个产品时,都需要增加一个具体类和工厂类,增加了系统内类的个数,某种程度上也算是增加了系统的复杂度。

反射

概念

反射是Java语言的一个特性,它允许程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作

使用场景

我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性、构造方法、一般方法后再考虑是否创建它的对象,这种情况该怎么办呢?这就需要用到反射!

抽象工厂与反射

抽象工厂 就是利用反射的机制实现动态生成对象

demo

  1. /**
  2. * 抽象工厂 即反射工厂
  3. *
  4. * @author Bai
  5. * @date 2020/11/21 16:12
  6. */
  7. public class ReflectFactory {
  8. /**
  9. * 通过反射动态的获取指定类
  10. *
  11. * @param className
  12. * @return
  13. */
  14. public Object getInstance(String className) {
  15. try {
  16. return Class.forName(className).newInstance();
  17. } catch (Exception e) {
  18. System.out.println(e.getMessage());
  19. }
  20. return null;
  21. }
  22. }

测试

  1. @Test
  2. public void reflectFactoryTest() {
  3. ReflectFactory reflectFactory = new ReflectFactory();
  4. Animal cat = (Animal) reflectFactory.getInstance("com.xy.blog.test.designpatterns.factory.Cat");
  5. cat.eat();
  6. Animal dog = (Animal) reflectFactory.getInstance("com.xy.blog.test.designpatterns.factory.Dog");
  7. dog.eat();
  8. Animal sheep = (Animal) reflectFactory.getInstance("com.xy.blog.test.designpatterns.factory.Sheep");
  9. sheep.eat();
  10. }

image.png

优点

1.不需要创建多个工厂类,抽象工厂类动态生成对象
2.业务方只需要 知晓类的全路径即可

缺点

反射生成对象的速度会比单词的new对象要慢1-2倍。

Spring IOC 实现

IOC基本上就是properties+反射机制实现的,只是将本来写死在代码中的类全路径配置在了properties里,反射根据配置在properties中的配置的类 生成对应的对象。这样扩展性更好,更灵活。

参考资料:https://blog.csdn.net/fuzhongmin05/article/details/61614873