工厂模式

1、简单工厂模式

     简单工厂模式即是将我们之前需要自己新建的对象,通过工厂来产生,并且每个产品对应着一个工厂。实现如下,首先看工程结构:
这里写图片描述
第一个包里面包含了一个工厂接口和两个不同产品的工厂,第二个包里面包含了一个移动的接口和两个移动的实现类。最后一个包是测试:

Factory factory = new CarFactory();
Move move = factory.create();
move.run();

可以看到,我们需要创建什么产品只需要调用对应的工厂即可,并且后面的代码不用修改。这个的缺点是每个产品对应一个工厂,如果要产生很多个产品,那么需要很多工厂,这样代码比较复杂,所以这里继续介绍抽象工厂。

2、抽象工厂模式

     抽象工厂解决了简单工厂一个产品对应一个工厂的问题,这里一个工厂可以创建多个产品。工厂结构如下:
这里写图片描述
第一个包中包含了一个工厂接口和两个工厂类,第二个包中包含了三个接口和这个接口的6个实现类。第三个包中是测试代码。

Factory factory = new GoodFactory();
factory.createFood().print();
factory.createMove().run();
factory.createTool().use();

可以看到我们一个工厂可以产生多个产品,如果需要产生不同的产品,只需要新建新的工厂即可。这样的缺点是如果要增减产品的种类,那么改动的地方将比简单工厂模式多,所以最后在介绍spring 的工厂IOC。

3、spring ioc

     这里spring的配置使用就不介绍了,不会的可以去网上学习,在文章最后也会提供这次测试的代码,通过spring ioc我们只需要对我们的需要用到的类注册xml文件中即可通过spring 这个工厂(容器)给我们产生产品,非常方便。工厂结构:
这里写图片描述
第一个包中是各种需要用到的类(产品),第二个包是测试代码,最后是xml配置文件,用来注册类。测试代码如下:

BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
Object o = factory.getBean("ak");
Tool move = (Tool)o;
move.use();

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-3.0.xsd">
  <bean id="ak" class="com.ly.product.AK">
  </bean>
</beans>

可以看到这里需要用到什么产品就直接通过spring容器获取即可,非常方便。

4、自己实现最简单的spring ioc

     最后我们在自己实现一个最简单的spring ioc的功能,因为需要解析xml文件,这里用jdom进行解析,所以也需要用到jdom的包。用到的包如下:
这里写图片描述
工程结构如下:
这里写图片描述
第一个包中的两个文件都是模仿spring来命名的,第二个包中是一些待注册类,第三个包是测试带啊名,这里测试代码和上面是完全一样的,最后的xml文件也是完全一样的。所以这里重点是第一个包的第二个文件:

    public ClassPathXmlApplicationContext(String filename) throws Exception{
        SAXBuilder sb = new SAXBuilder();
        Document doc = sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(filename));
        Element root = doc.getRootElement();
        System.out.println(root);
        List list = XPath.selectNodes(root, "/beans/bean");
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            Element bean = (Element) list.get(i);
            String id = bean.getAttributeValue("id");
            String clazz = bean.getAttributeValue("class");
            System.out.println(id +" " +clazz);
            Object object = Class.forName(clazz).newInstance();
            map.put(id, object);
        }
    }

首先看这个构造方法,先加载我们的xml配置文件,然后获取到文件的根节点,再获取到子节点列表,再通过循环获取到每一个节点,并通过反射生成对象,并将对象都放入到map容器中。

    public Object getBean(String id) {
        // TODO Auto-generated method stub
        return map.get(id);
    }

最后通过getBean方法获取到这个对象即可。最后附上本工程的下载链接:
工程代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值