spring工厂模式
https://blog.csdn.net/qq_57005976/article/details/134367016
工厂模式
工厂模式的三种形态: 工厂模式是解决对象创建问题的属于创建型设计模式,Spring框架底层使用了大量的工厂模式
第一种:简单工厂模式是工厂方法模式的一种特殊实现,简单工厂模式又叫静态工厂方法模式不属于23种设计模式之一 (抽象类)
第二种:工厂方法模式, 是23种设计模式之一(接口)
第三种:抽象工厂模式, 是23种设计模式之一
在Spring框架中,工厂方法模式通常被称为“FactoryBean”模式。Spring提供了一个名为FactoryBean的接口,通过实现这个接口,可以自定义Bean的实例化逻辑。
当一个Bean实现了FactoryBean接口时,Spring容器会调用该Bean的getObject()方法来获取实际的Bean实例,而不是直接使用反射来实例化Bean。因此,FactoryBean可以用来创建复杂对象,或者需要某种定制实例化逻辑的对象。
以下是一个简单的FactoryBean示例:
java
复制代码
import org.springframework.beans.factory.FactoryBean;
public class MyBeanFactory implements FactoryBean<MyBean> {
@Override
public MyBean getObject() throws Exception {
// 自定义实例化逻辑
return new MyBean();
}
@Override
public Class<?> getObjectType() {
return MyBean.class;
}
@Override
public boolean isSingleton() {
return true; // 或者返回 false 表示非单例
}
}
在Spring配置文件中使用FactoryBean:
xml
复制代码
<bean id="myBean" class="com.example.MyBeanFactory"/>
或者在注解配置中使用:
java
复制代码
@Configuration
public class AppConfig {
@Bean
public MyBeanFactory myBeanFactory() {
return new MyBeanFactory();
}
}
这样,Spring容器在获取名为myBean的Bean实例时,会调用MyBeanFactory的getObject()方法来获取实际的MyBean对象。
总结来说,在Spring中,工厂方法模式通常通过实现FactoryBean接口来实现,提供了灵活的Bean实例化方式。
静态工厂模式:
//工厂类角色:根据不同的武器类型不同的生产武器
public class WeaponFactory {
// 根据不同的武器类型生产不同的武器
public static Weapon get(String weaponType){
if (weaponType == null || weaponType.trim().length() == 0) {
return null;
}
Weapon weapon = null;
if ("TANK".equals(weaponType)) {
weapon = new Tank();
} else if ("FIGHTER".equals(weaponType)) {
weapon = new Fighter();
} else {
throw new RuntimeException("不支持该武器!");
}
return weapon;
}
}
编写测试程序,通过指定武器的类型从静态工厂中获取对应的武器
public class Client {
public static void main(String[] args) {
Weapon weapon1 = WeaponFactory.get("TANK");
weapon1.attack();
Weapon weapon2 = WeaponFactory.get("FIGHTER");
weapon2.attack();
}
}
工厂方法模式:
// 具体产品角色:枪
public class Gun extends Weapon{
@Override
public void attack() {
System.out.println("开枪射击!");
}
}
// 具体产品角色:战斗机
public class Fighter extends Weapon{
@Override
public void attack() {
System.out.println("战斗机发射核弹!");
}
}
编写测试程序,获取对应的工厂创建对应的产品
public class Client {
public static void main(String[] args) {
// 这里的new GunFactory()可以采用简单工厂模式进行隐藏,调用WeaponFactory的静态方法根据传递的参数创建对应的工厂
WeaponFactory factory = new GunFactory();
Weapon weapon = factory.get();
weapon.attack();
WeaponFactory factory1 = new FighterFactory();
Weapon weapon1 = factory1.get();
weapon1.attack();
}
}
抽象工厂模式:
抽象工厂角色: 既能生产武器又能生产水果
public abstract class AbstractFactory {
public abstract Weapon getWeapon(String type);
public abstract Fruit getFruit(String type);
}