工厂模式- 2020-11-21 16:25- 工厂模式: 设计模式,工厂模式
理论上 任何可以生产对象或者方法的类 都可以叫做工厂类
静态工厂
demo
模型类
/*** 动物类** @author Bai* @date 2020/11/21 15:51*/public interface Animal {void eat();}
/*** 猫类** @author Bai* @date 2020/11/21 15:51*/public class Cat implements Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}}
/*** 狗类** @author Bai* @date 2020/11/21 15:52*/public class Dog implements Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}}
/*** @author Bai* @date 2020/11/21 15:52*/public class Sheep implements Animal {@Overridepublic void eat() {System.out.println("羊吃草");}}
工厂类
/*** 简单工厂类** @author Bai* @date 2020/11/21 16:03*/public class SimpleFactory {public Animal create(String className) {if (className.equals("Cat")) {return new Cat();} else if (className.equals("Dog")) {return new Dog();} else if (className.equals("Sheep")) {return new Sheep();}return null;}}
测试
@Testpublic void simpleFactoryTest() {SimpleFactory simpleFactory = new SimpleFactory();simpleFactory.create("Cat").eat();simpleFactory.create("Dog").eat();simpleFactory.create("Sheep").eat();}
优点
1.使用者不需要感知 如何创建对象,屏蔽创建过程
2.如果新增初动物外的其他产品,例如想增加植物,只需要新增模型类和对应的工厂类即可
3.只需要知道想要的类名即可
缺点
每次增加一个产品时,都需要增加一个具体类和工厂类,增加了系统内类的个数,某种程度上也算是增加了系统的复杂度。
反射
概念
反射是Java语言的一个特性,它允许程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作
使用场景
我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性、构造方法、一般方法后再考虑是否创建它的对象,这种情况该怎么办呢?这就需要用到反射!
抽象工厂与反射
抽象工厂 就是利用反射的机制实现动态生成对象
demo
/*** 抽象工厂 即反射工厂** @author Bai* @date 2020/11/21 16:12*/public class ReflectFactory {/*** 通过反射动态的获取指定类** @param className* @return*/public Object getInstance(String className) {try {return Class.forName(className).newInstance();} catch (Exception e) {System.out.println(e.getMessage());}return null;}}
测试
@Testpublic void reflectFactoryTest() {ReflectFactory reflectFactory = new ReflectFactory();Animal cat = (Animal) reflectFactory.getInstance("com.xy.blog.test.designpatterns.factory.Cat");cat.eat();Animal dog = (Animal) reflectFactory.getInstance("com.xy.blog.test.designpatterns.factory.Dog");dog.eat();Animal sheep = (Animal) reflectFactory.getInstance("com.xy.blog.test.designpatterns.factory.Sheep");sheep.eat();}
优点
1.不需要创建多个工厂类,抽象工厂类动态生成对象
2.业务方只需要 知晓类的全路径即可
缺点
Spring IOC 实现
IOC基本上就是properties+反射机制实现的,只是将本来写死在代码中的类全路径配置在了properties里,反射根据配置在properties中的配置的类 生成对应的对象。这样扩展性更好,更灵活。
参考资料:https://blog.csdn.net/fuzhongmin05/article/details/61614873
