1. 程式人生 > >Java學習不走彎路教程(12 Container容器)

Java學習不走彎路教程(12 Container容器)

user () sys src con public 根據 基礎上 access

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容器)