工厂模式- 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 {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
/**
* 狗类
*
* @author Bai
* @date 2020/11/21 15:52
*/
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
/**
* @author Bai
* @date 2020/11/21 15:52
*/
public class Sheep implements Animal {
@Override
public 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;
}
}
测试
@Test
public 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;
}
}
测试
@Test
public 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