Java中的工厂模式

工厂模式的思想:
工厂类自主生产产品,而不用其它类去new一个产品

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

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

汽车产品类
Car.java
1
public class Car implements Moveable{
2
    @Override
3
    run(){
4
       //定制的汽车run行为代码 
5
    }
6
    
7
}
飞机产品类
Plane.java
1
public class Plane implements Moveable{
2
3
    @Override
4
    run(){
5
        //定制的飞机run行为代码
6
    }
7
}
测试类
Test.java
1
public class Test{
2
    public static void main(String[] args){
3
        TransportToolFactory carFactory = new CarFactory();//创建汽车工厂
4
        TransportToolFactory planeFactory = new PlaneFactory();//创建飞机工厂
5
        
6
        Moveable car = carFactory.getProduce();//得到汽车产品
7
        Moveable plane = planeFactory.getProduce();//得到飞机产品
8
        
9
        car.run();//产品自定义行为
10
        plane.run();
11
    } 
12
}
抽象工厂:
场景:(用于产生 产品系列
思路:
    抽象工厂(父)--- 具体工厂(子)----》生产具体产品    
    抽象产品(父)-----具体产品(子)
交通工具类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
1
public class AFactory extends AbstractFactory{
2
    //造汽车A
3
    @Override
4
    Vehicle createVehicle(){
5
        new CarA();
6
    }
7
    //造苹果A
8
    @Override
9
    Food createVehicle(){
10
        new AppleA();
11
    }
12
}
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
1
public abstract class Vehicle{
2
    //描述交通工具行为
3
}
总食物类(抽象,代表一系列食物)
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
1
public class Test{
2
    public static void main(String[] args){
3
        AbstractFactory factory = new AFactory();//创建A抽象工厂
4
        //AbstractFactory factory = new BFactory();//创建B抽象工厂,只需修改一行代码
5
        
6
        factory.createVehicle();//创建该工厂的交通工具
7
        factory.createFood();//创建该工厂的食物
8
    }
9
}
抽象工厂的好处:
如果需要修改工厂,只需修改一行代码new一个新的Factory即可,工厂的生产产品的方法严格按照AbstractFactory这个抽象类写,可以统一create方法,因此生产产品的方法不需要修改

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

    2.在main方法中得到类对象
1
public static void(String[] args){
2
    BeanFactory f = new ClassPathXmlApplicationContext("全类名");
3
    Object obj = f.getBean("对应这个类的key"); 
4
}

底层实现:
    工厂接口
    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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值