Java学习不走弯路教程(12 Container容器)

Posted java123-vip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习不走弯路教程(12 Container容器)相关的知识,希望对你有一定的参考价值。

Container容器

一. 前言

在前上一章教程中,介绍了单例模式。
本章将在上一章的基础上,进一步扩展程序。

注:
1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题。
2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓。

学习本章需要准备的知识:
1.读完本系列教程的前面章节。

二. 步入正题
话不多说,大家自己理解,下面步入正题:

单例模式虽然能满足我们的需求,但这种非业务的代码侵入了每一个业务类。
如下图所示:
技术分享图片

本章我们来做一个容器,让容器负责类的创建。
由于容器只有一个,所以我们把容器做成单例模式。

使用方式如下:

// 创建一个容器
MyContainer container = MyContainer.getInstance();
// 根据类型返回对应的实例
PersonService personService = (PersonService)container.getObject(PersonService.class);

 

容器代码如下:

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class MyContainer {
 7 
 8     private static MyContainer instance = new MyContainer();
 9     
10     private MyContainer() {}
11     
12     public static MyContainer getInstance() {
13         return instance;
14     }
15     
16     // 保存已经生成的对象
17     private Map<String,Object> objectMap = new HashMap<String,Object>();
18     
19     /**
20      * 获得一个对象的实例
21      * 
22      * @param cls
23      * @return
24      */
25     public Object getObject(Class cls) {
26         
27         String classFullName = cls.getName();
28         
29         Object obj = objectMap.get(classFullName);
30         
31         // 如果第一次创建,则生成新的实例并保存,否则返回已生成的实例。
32         if(obj == null) {
33             
34             try {
35                 obj = cls.newInstance();
36                 objectMap.put(classFullName, obj);
37                 return obj;
38             } catch (InstantiationException e) {
39                 e.printStackTrace();
40             } catch (IllegalAccessException e) {
41                 e.printStackTrace();
42             }
43             
44             return null;
45         }else {
46             return obj;
47         }
48         
49     }
50 }

 

于是程序变成这样的写法:

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class PersonService {
 7 
 8     public Person getPerson(String personid) {
 9         MyContainer container = MyContainer.getInstance();
10         PersonDao personDao = (PersonDao)container.getObject(PersonDao.class);
11         
12         Person person = personDao.getPersonById(personid);
13         
14         return person;
15     }
16 }
/**
 * 
 * @author http://www.java123.vip
 *
 */
public class PersonDao {

    public void savePerson(Person person) {
......略
    }

    public Person getPersonById(String id) {
......略
    }

}

三. 测试
测试代码如下:

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class PersonServiceTest {
 7 
 8     public static void main(String[] args) {
 9         
10         MyContainer container = MyContainer.getInstance();
11         PersonService personService = (PersonService)container.getObject(PersonService.class);
12         
13         Person personResult = personService.getPerson("1");
14         
15         System.out.println("id:"+personResult.id);
16         System.out.println("username:"+personResult.username);
17         System.out.println("password:"+personResult.passwd);
18     }
19 }

 

程序输出如下:

id:1
username:abc
password:aaa


完整程序请大家从[这里]下载

如有问题,大家来我的网站进行提问。
https://www.java123.vip/qa

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。












以上是关于Java学习不走弯路教程(12 Container容器)的主要内容,如果未能解决你的问题,请参考以下文章

Java学习不走弯路教程(3.从文件内容查询开始)

Java学习不走弯路教程(14 代码结构整理)

Java学习不走弯路教程(3.从文件内容查询开始)

Java学习不走弯路教程(7 ORM框架(数据到对象映射))

Java学习不走弯路教程(11 单例模式2(单实例类))

Java学习不走弯路教程(7.Eclipse环境搭建)