码迷,mamicode.com
首页 > 编程语言 > 详细

从基础知识到重写Spring的Bean工厂中学习java的工厂模式

时间:2015-09-18 23:19:07      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

1、静态工厂模式
其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象
这样,就可以控制类的产生过程
顺带提一下单例模式和多例模式:
  单例模式是指控制其他对象获得该对象永远只有同一个对象
  而多例模式则是根据需要从某个具体集合中获取所需的对象

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 
 5 public class Car implements Moveable{
 6     private static Car car = new Car();  //控制其他对象获得该对象永远只有同一个对象
 7     private static List<Car> cars = new ArrayList<Car>();  //多例
 8 
 9     //将构造方法私有化,限制其他对象无限制的new出Car对象
10     private Car(){}
11 
12     //通过静态方法获得new 出的对象
13     //即在取得该对象的过程由Car本身控制,可以为其添加各类限制
14     public static Car getInstance(){
15         //if() if。。。。
16         return car;
17     }
18     public void run(){
19         System.out.println("the car is running......");
20     }
21 }

 


2、普通工厂模式
与静态工厂不同,普通工厂将产生的过程交由其他的类处理,而并非类的本身。

1 public class CarFactory {
2     
3     @Override
4     Moveable create() {
5         return new Car() ;
6     }
7 }

 



这样就可以通过获得CarFactory的对象,调用create()得到Car对象

3、抽象工厂模式

抽象工厂是指工厂类要产生一个系列的对象,将工厂类进行抽象,这样就可以通过改变工厂类,从而能够改变一系列的对象。
其实這就慢慢接近面向抽象编程。

这里类就比较多,就从抽象程度由上到下进行介绍:
(1)、测试类

技术分享
 1 public class Test {
 2     public static void main(String[] args){
 3        
 4         AbstractFactory d = new DefaultFactory();
 5 
 6     /**
 7     可以通过AbstractFactory d = new NewFactory() 可以替换系类对象
 8     **/
 9 
10         Vehicle v = d.createVehicle();
11         Food f = d.createFood();
12 
13         v.run();
14         f.eat();
15         
16     }
17 }
View Code

 



(2)、抽象工厂

技术分享
1 public abstract class AbstractFactory {
2     public abstract Vehicle createVehicle();
3     public abstract Food createFood();
4 }
View Code

 



(3)、抽线工厂实现类

技术分享
 1 public class NewFactory extends AbstractFactory{
 2 
 3 
 4     @Override
 5     public Vehicle createVehicle() {
 6         return new Plane();
 7     }
 8 
 9     @Override
10     public Food createFood() {
11         return new Banana();
12     }
13 }
View Code

 

 

技术分享
 1 public class DefaultFactory extends AbstractFactory{
 2 
 3 
 4     @Override
 5     public Vehicle createVehicle() {
 6         return new Car();
 7     }
 8 
 9     @Override
10     public Food createFood() {
11         return new Apple();
12     }
13 }
View Code

 


(4)、交通工具抽象类以及实现类

技术分享
1 public abstract class Vehicle {
2     public abstract void run();
3 }
View Code

 


******************************

技术分享
1 public class Car extends Vehicle{
2 
3     public void run(){
4         System.out.println("the car is running......");
5     }
6 }
View Code

 



技术分享
1 public class Plane extends Vehicle{
2     @Override
3     public void run() {
4         System.out.println("the plane is flying...");
5     }
6 }
View Code

 


(5)、食物抽象类以及实现类

技术分享
1 public abstract class Food {
2     public abstract void eat();
3 }
View Code

 



*****************************

技术分享
1 public class Apple extends Food{
2     public void eat(){
3         System.out.println("eating apple...");
4     }
5 }
View Code

 

 

技术分享
1 public class Banana extends Food{
2     public void eat(){
3         System.out.println("eating Banana...");
4     }
5 }
View Code

 



普通工厂模式与抽象工厂各有优缺点,
在产生对象系类时,普通工厂会有工厂泛滥的现象
抽象工厂在产生新的对象类型时,从上到下都需要改动


4、Spring的Bean工厂
现在就需要运用工厂知识来模拟Spring的Bean工厂了

我们先看看Spring是如何运用Bean工厂的

(1)、applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="v"  class="com.csu.springFactory.Train">
    </bean>
    <!--类似 一般配置文件的 v="com.csu.springFactory.Car" 的格式-->

</beans>

 



(2)、测试类:

 1 import org.springframework.beans.factory.BeanFactory;
 2 import org.springframework.context.support.ClassPathXmlApplicationContext;
 3 
 4 public class TestForSpring {
 5     public static void main(String[] args){
 6         BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
 7         Object o = factory.getBean("v");  //找到 id = v对应的class, getInstance得到一个Bean对象,返回
 8         Moveable m = (Moveable)o;
 9         m.run();
10 
11     }
12 }

 


Spring 的applicationContext.xml中配置了实体类的信息,通过解析改配置文件,可以得到一个包含了所有类对象的工厂,
然后其他对象通过该工厂对象,调用getBean得到,以id为参数,得到对象

在理解了这些之后,我们就可以开始模拟了,其实最主要的部分就是在于解析xml配置文件,可以通过id获得类名,然后利用
反射得到该类,getInstance()后获得对象。解析xml文件有很对方法,这里就用JDOM.

(1)模拟的配置文件 applicationContext_simulation.xml (简化)

<?xml version="1.0" encoding="UTF-8"?>
<beans>

    <bean id="v"  class="com.csu.springSimulation.Car">
        <!-- collaborators and configuration for this bean go here -->
    </bean>
    <!--类似 spring.properties配置文件的 v="com.csu.springFactory.Car" 的格式-->

</beans>

 



(2)模拟BeanFactory

 1 public interface BeanFactory_simulation { 2 Object getBean(String id); 3 } 

(3)模拟BeanFactory的实现类ClassPathXmlApplicationContext_simulation

 1 import org.jdom2.Document;
 2 import org.jdom2.Element;
 3 import org.jdom2.input.SAXBuilder;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 
 9 public class ClassPathXmlApplicationContext_simulation implements BeanFactory_simulation{
10     //要自定义方法解析applicationContext.xml
11     //Spring 的解析方式为ClassPathXmlApplicationContext("applicationContext.xml");  这个类就是要模拟ClassPathXmlApplicationContext的功能
12 
13     private Map<String,Object> container = new HashMap<String, Object>();  //存放所有对象
14 
15     public ClassPathXmlApplicationContext_simulation(String filename) throws Exception {
16         SAXBuilder sb=new SAXBuilder();
17         Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream(filename));
18         Element root=doc.getRootElement();   
19         List list=root.getChildren("bean");  
20 
21         System.out.println(list.size());
22 
23         for(int i=0;i<list.size();i++){
24             Element element=(Element)list.get(i);
25             String id=element.getAttributeValue("id");
26             String clazz = element.getAttributeValue("class");
27 
28             Object o = Class.forName(clazz).newInstance();
29             container.put(id,o);
30 
31         }
32 
33     }
34 
35     @Override
36     public Object getBean(String id) {
37         return container.get(id);
38     }
39 }

 


(4)测试类

1 public class Test {
2     public static void main(String[] args) throws Exception {
3         BeanFactory_simulation beanFactory_simulation = new ClassPathXmlApplicationContext_simulation("com/csu/springSimulation/applicationContext_simulation.xml");
4         Object o = beanFactory_simulation.getBean("v");
5         Moveable m = (Moveable)o;
6         m.run();
7     }
8 }

 


这样我们就基本清楚了Spring的Bean工厂的模式了,面向抽象编程,将具体类放在配置文件中

从基础知识到重写Spring的Bean工厂中学习java的工厂模式

标签:

原文地址:http://www.cnblogs.com/chentao-cus/p/4820459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!