Java中的工厂模式

来源:互联网 发布:冰箱离墙距离 知乎 编辑:程序博客网 时间:2024/05/07 20:47
工厂模式的思想:
工厂类自主生产产品,而不用其它类去new一个产品

简单工厂:
需求:构造一个交通工具工厂,可以自定义汽车、飞机及其交通工具跑起来的方式run方法
思路:
    抽象工厂类(父)-----具体工厂类(子)-----》生产具体产品
总工厂抽象类:
TransportToolFactory.java
汽车工厂类
CarFactory.java
1
public class CarFactory extends TransportToolFactory{
2
    @Override
3
    public Car getProduce(){
4
        return new Car();
5
    }
6
}
飞机工厂类
PlaneFactory.java

总产品类的接口(产品的共有特性)
Moveable.java
1
public interface Moveable{
2
    void run();//产品共有的run行为
3
}

汽车产品类
Car.java
飞机产品类
Plane.java
1
public class Plane implements Moveable{
2
3
    @Override
4
    run(){
5
        //定制的飞机run行为代码
6
    }
7
}
测试类
Test.java
抽象工厂:
场景:(用于产生产品系列
思路:
    抽象工厂(父)--- 具体工厂(子)----》生产具体产品    
    抽象产品(父)-----具体产品(子)
交通工具类Vehicle:包括汽车A、汽车B
食品类Food:包括苹果A、苹果B
工厂A:生产汽车A,苹果A
工厂B:生产汽车B,苹果B

-----------------------------工厂类---------------------------------
总工厂类(抽象)
AbstractFactory.java
1
public abstract class AbstractFactory{
2
    public abstract Vehicle createVehicle();//汽车工厂
3
    public abstract Food createFood();//食物工厂
4
}
A工厂类(具体)
AFactory.java
B工厂类(具体)
BFactory.java
1
public class BFactory extends AbstractFactory{
2
    //造汽车B
3
    @Override
4
    public Vehicle createVehicle(){
5
        new CarB();
6
    }
7
    //造苹果B
8
    @Override
9
    public Food createFood(){
10
        new AppleB();
11
    }
12
}

-------------------------- 产品类 ---------------------------
总交通工具类(抽象,代表一系列交通工具)
Vehicle.java
总食物类(抽象,代表一系列食物)
Food.java
1
public abstract class Food{
2
    //描述食物行为
3
}
抽象产品具体化:
汽车A类继承Vehicle类  CarA extends Vehicle
汽车B类继承Vehicle类  CarB extends Vehicle
苹果A类继承Food类  AppleA extends Food
苹果B类继承Food类  AppleB extends Food

----------------------------- 测试类 ---------------------------------
Test.java
抽象工厂的好处:
如果需要修改工厂,只需修改一行代码new一个新的Factory即可,工厂的生产产品的方法严格按照AbstractFactory这个抽象类写,可以统一create方法,因此生产产品的方法不需要修改

Spring中的BeanFactory工厂模式:
Spring中的IOC用法:
    1.ApplicationContext.xml中加入bean标签
        
1
<bean id="对应这个类的key" class="全类名">
2
</bean>

    2.在main方法中得到类对象

底层实现:
    工厂接口
    BeanFactory.java
1
public interface BeanFactory{
2
    Object getBean(String id);
3
}
    工厂实现类
    ClassPathXmlApplicationContext.java
1
public class ClassPathXmlApplicationContext implements BeanFactory{
2
    //Bean容器HashMap
3
    private Map<String,Object> container = new HashMap<String, Object>();
4
    
5
    //从文件名中找到文件并读取
6
    public ClassPathXmlApplicationContext(String classPath){
7
        //使用JDOM、SAX或DOM4J解析XML文件得到bean结点
8
        //得到bean结点的id属性值id
9
        //得到bean结点的class属性值clazz
10
        //反射得到类对象
11
        Object object = Class.forName(clazz).newInstance();
12
        //放入bean容器HashMap
13
        container.put(id,object);
14
    }
15
    
16
    
17
    //通过配置文件的bean标签中的id得到全类名---反射--返回类对象
18
    @Override
19
    public Object getBean(String id){
20
        //从bean容器取出Object
21
        container.get(id);
22
    }
23
}