Spring&Spring MVC技术分享-带参数的工厂方法获取类实例
作者:
22-426
,
2022-03-25 10:27:35
,
所有人可见
,
阅读 169
C02_D13_factory_method
//bean
public interface Animal {
void eat();
}
public class Pig implements Animal{
@Override
public void eat() {
System.out.println("这是猪,吃饲料~~~");
}
}
public class Sheep implements Animal{
@Override
public void eat() {
System.out.println("这是羊,吃草......");
}
}
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("这是狗,吃骨头!!!");
}
}
public class AnimalFactory {
//静态工厂方法
public static Animal getAnimal1() {
System.out.println("调用AnimalFactory类的静态工厂方法getAnimal1().................");
return new Dog();
}
//非静态工厂方法,也叫做实例工厂方法
public Animal getAnimal2() {
System.out.println("调用AnimalFactory类的实例工厂方法getAnimal2().................");
return new Pig();
}
private static Map<Integer,Animal> map;
static {
map=new HashMap<>();
map.put(1,new Dog());
map.put(2,new Pig());
map.put(3,new Sheep());
}
public static Animal getAnimal3(int type) {
System.out.println("调用AnimalFactory类的静态工厂方法getAnimal3().................");
return map.get(type);
}
}
//config-beans.xml
<!-- 现在希望调用AnimalFactory这个工厂类的 -->
<!-- 静态方法getAnimal3(int type)生产某种类型的动物 -->
<!-- 1-Dog,2-Pig,3-Sheep -->
<!-- 如果是调用一个工厂类的静态方法,class定义的类型是工厂类的类型 -->
<bean id="animal" class="com.qdu.bean.AnimalFactory"
factory-method="getAnimal3">
<!-- 如果工厂方法是带参数的工厂方法 -->
<!-- 则可以使用constructor-arg指定参数的名称和参数的值 -->
<!-- constructor-arg虽然在之前的依赖注入中是用于指定构造函数参数的 -->
<!-- 但是这里是用于指定方法的普通参数的值-->
<constructor-arg name="type" value="3" />
</bean>
//main
/**
* *使用带参数的工厂方法
*
* @author 22-426
*/
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/beans4.xml");
//三种写法都可 可以用类型获取,因为配置文件中,制定了bean的class属性.
// Animal animal = (Animal) ctx.getBean("animal");
// Animal animal = (Animal) ctx.getBean(Sheep.class);
Animal animal = (Animal) ctx.getBean(Animal.class);
animal.eat();
}