1. 程式人生 > >框架漫談之spring(一)工廠模式實現程式解耦,spring框架的引出

框架漫談之spring(一)工廠模式實現程式解耦,spring框架的引出

1.程式的耦合度

我們來看如下的程式碼

// 表現層
public class UserController {
    public static void main(String[] args) {
        IUserService userService = new UserServiceImpl();
        userService.saveUser();
    }
}
// 業務實現類介面
public interface IUserService {
    void saveUser();
}
// 業務實現類
public class UserServiceImpl
implements IUserService {
private UserDao userDao = new UserDao(); public void saveUser() { userDao.saveUser(); }
// 持久層介面
public interface IUserDao{
    void saveUser();
}
// 持久層實現類
public class UserDaoImpl implements IUserDao {
    System.out.println("儲存一個使用者");
}

該程式模擬了某網站註冊使用者的流程,我們來看上述的程式,表面上來看是沒有一點問題的,但仔細的看。表現層與業務層、業務層與持久層緊緊的互相依賴關聯,這與我們開發程式的高內聚低耦合原則相違背。我們也來看一看原始的JDBC程式

//註冊mysql驅動
DriverManager.deregisterDriver(new com.mysql.jdbc.Driver());

點進jdbc註冊驅動的原始碼可以知道,當載入這個類時候 已經註冊,這樣相當於註冊了兩次。從程式的角度的來看即使註冊了2次所浪費的效率基本上可以忽略不計。原始的JDBC註冊驅動 緊緊的依賴著mysql的jar包,一旦沒有mysql的jar包編譯時就會報錯,所以我們真正寫JDBC註冊驅動的是用這行程式碼

//註冊mysql驅動  改進了註冊2次的問題 並且做到了編譯時候不依賴
Class.forName("com.mysql.jdbc.Driver"
);

從JDBC和上述模擬使用者註冊的案例來看,當有一個類在編譯時候,緊緊依賴於另外一個類的存在.
當沒有依賴類存在時,程式不能編譯.此時我們就稱這兩個類有很想的依賴關係,高耦合度
開發中應該遵循的依賴原則:編譯時不依賴,執行時在依賴。

2.工廠模式實現程式解耦

使用工廠模式:
工廠為我們建立類的物件,從而解決層和層之間的依賴關係。
這種依賴關係我們也叫,程式的耦合。

package test.factory;
import test.dao.IUserDao;

/**
 * 工廠模式: 用於削減計算機程式耦合
 * 
 * @author ZhuPengWei
 * @Date 2017年9月24日
 */
public class BeanFactory {
    private static BeanFactory factory;
    static {
        factory = new BeanFactory();
    }

    // 單例模式:私有化建構函式
    private BeanFactory() {
    }

    // 提供一個公共方法,獲取該類的例項
    public static BeanFactory newInstance() {
        return factory;
    }

    /**
     * 用於生成一個的持久層實現類物件
     * 
     * @return
     */
    public IUserDao getUserDao() {
        try {
            return (IUserDao) Class.forName("test.dao.impl.UserDao").newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

使用者業務層實現類也作出如下的改進

public class UserServiceImpl implements IUserService {
    // private IUserDao userDao = new UserDao();
    IUserDao userDao = BeanFactory.newInstance().getUserDao();

    public void saveUser() {
        userDao.saveUser();
    }
}

3.工廠模式改進

仔細的來看,上面的工廠模式存在了大量的問題,首先它在反射建立物件時候使用了硬編碼,存在硬編碼的問題。其次此工廠模式不利於程式的擴充,首先開發需要寫獲取持久層的方法以及業務層的方法,一旦有新的解耦需求工廠類就得新增新的方法,這樣是十分不利於維護的。下面,將對於這兩點進行改進
在類路徑下建立bean.properties

USERDAO = test.dao.impl.UserDaoImpl
USERSERVICE =test.service.impl.UserServiceImpl
package test.factory;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;


/**
 * 工廠模式: 用於削減計算機程式耦合
 * 
 * @author ZhuPengWei
 * @Date 2017年9月24日
 */
public class BeanFactory {
    // 此類可以通過靜態方法獲取物件,引數是資原始檔的名稱(不寫程式的副檔名)。
    // 底層是類載入器,因此只能讀取類路徑下的資原始檔(src目錄下)。
    private static ResourceBundle bundle = ResourceBundle.getBundle("bean");

    // 定義一個容器,用於儲存配置檔案中配置的物件
    private static Map<String, Object> beans = new HashMap<String, Object>();

    private static BeanFactory factory;
    static {
        factory = new BeanFactory();
        // 初始化容器
        Enumeration<String> keys = bundle.getKeys();
        while (keys.hasMoreElements()) {
            // 取出每一個key
            String key =  keys.nextElement();
            // 根據key,獲取全限定類名
            String classPath = bundle.getString(key);
            try {
                // 根據classPath反射建立類物件
                Object object = Class.forName( classPath).newInstance();
                // 存入map中
                beans.put(key, object);
            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
                throw new ExceptionInInitializerError("初始化容器失敗!");
            }

        }
    }

    // 單例模式:私有化建構函式
    private BeanFactory() {
    }

    // 提供一個公共方法,獲取該類的例項
    public static BeanFactory newInstance() {
        return factory;
    }

    /**
     * 根據引數獲取Bean物件
     * @param beanName 引數
     * @return Bean物件
     */
    public Object getBean(String beanName){
        return beans.get(beanName);
    }


    /**
     * 用於生成一個的持久層實現類物件
     * 由於返回值是一個固定的介面,所以導致了建立其他類物件時,必須寫新的方法
     * @return
     */
    // public IUserDao getUserDao() {
    // try {
    // return (IUserDao) Class.forName("test.dao.impl.UserDao").newInstance();
    // } catch (Exception e) {
    // throw new RuntimeException(e);
    // }
    // }
}
package test.service.impl;

import test.dao.IUserDao;
import test.factory.BeanFactory;
import test.service.IUserService;
/**
 * 使用者業務層實現類
 *
 * @author ZhuPengWei
 * @Date  2017年9月24日
 */
public class UserServiceImpl implements IUserService {
    // private IUserDao userDao = new UserDao();
    //IUserDao userDao = BeanFactory.newInstance().getUserDao();

    //改造後的方法:獲取bean物件,根據bean名稱。得到的物件是Object,需要強轉
    private IUserDao userDao  = (IUserDao) BeanFactory.newInstance().getBean("USERDAO");

    public void saveUser() {
        userDao.saveUser();
    }
}

4.spring框架引出

那我們為什麼要用spring呢?首先它的好處之一就是方便解耦簡化開發。
spring是一個大工廠,可以將所有物件建立和依賴維護交給spring去管理
暫時本文也只是說明了這一個好處。

什麼是spring框架?
spring是一個開源框架。它是為了解決企業應用開發的複雜性而建立的,框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個元件,同時為J2EE應用程式開發提供繼承的框架。spring使用基本的JAVABean來完成以前只可能由EJB完成的事情。spring的用途也不僅僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從spring中收益。spring的核心就是控制反轉(ioc)和麵向切面(aop)。簡單的來說,spring是一個分層的一站式輕量級開源框架

spring是用來幹什麼的?
這個介紹的不錯

相關推薦

框架漫談spring()工廠模式實現程式spring框架引出

1.程式的耦合度 我們來看如下的程式碼 // 表現層 public class UserController { public static void main(String[] args) { IUserService user

Spring中如何使用工廠模式實現程式

目錄 1、 啥是耦合、解耦? 2、 jdbc程式進行解耦 3、傳統dao、service、controller的程式耦合性 4、使用工廠模式實現解耦 5、工廠模式改進 6、結語

Dubbo框架應用)--服務體系

white 部件 esp 恢復 fonts resp auto zh-cn 通過 Dubbo 是阿裏巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,能夠和 Spring框架無縫集成,也是一個很全面的

c++ 設計模式簡單的工廠模式

urn ret 應用程序 on() name clu get actor new 調試環境:vs2010 // test0.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include <iostream>

Android學習探索運用MVP設計模式實現項目

Android 前言: 一直致力於提高開發效率降低項目耦合,今天想抽空學習一下MVP架構設計模式,學習一下如何運用到項目中。 MVP架構設計模式 MVP模式是一種架構設計模式,也是一種經典的界面模式。MVP中的M代表Model, V是View, P是Pre

C#設計模式四抽象工廠模式(AbstractFactory)【創建型】

抽象 抽象工廠 album 代碼 ctf bst actor 抽象工廠模式 .cn 一、引言 寫了3篇有關設計模式的文章了,大家有了些反饋,說能從中學到一些東西,我感到很欣慰,那就繼續努力。今天我要寫第四個模式了,該模式叫抽象工廠。上一篇文章我們講了【工廠方法】模式,它是為

c#使用單例模式實現數據庫連接

strings instance ssl div lock config onf 鎖定 特殊 1、使用程序集Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; using System.Co

Java的設計模式 簡單的工廠模式(二)

attack reat nds public create mark mar ace cto 下面的代碼是稍微改進後的工廠模式 abstract class MoveAble{ public abstract void run(); } abstract c

框架學習

學習工作當中用到了那麼多的框架,難免會想搞清楚這些框架的底層到底是怎樣實現的,藉此機會從簡單的寫起,嘗試著去實現一個框架   一,通過解析xml,獲取其中的欄位,用反射技術呼叫類中的方法   技術:dom4j,java反射 1,定義一個介面 package com.epro.f

Java進階篇設計模式 ---- 策略模式和模板方法模式

前言 在上一篇中我們學習了行為型模式的訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。本篇則來學習下行為型模式的兩個模式,策略模式(Strategy Pattern)和模板模式(Mediator Pattern)。 策略模式 簡介 策略模式(Stra

設計模式禪(4)-工廠模式

文章目錄 一、簡單工廠模式 1.1、單一new方式 1.2、簡單工廠模式 二、抽象工廠及工廠方法 2.1、將簡單工廠改造成抽象工廠 2.2、為抽象工廠

ActiveMQ釋出- 訂閱訊息模式實現

一、概念 釋出者/訂閱者模型支援向一個特定的訊息主題釋出訊息。0或多個訂閱者可能對接收來自特定訊息主題的訊息感興趣。在這種模型下,釋出者和訂閱者彼此不知道對方。這種模式好比是匿名公告板。這種模式被概括為:多個消費者可以獲得訊息 在釋出者和訂閱者之間存在時間依賴性。釋出者需要建

簡單工廠模式實現

一. 為什麼要學設計模式 我們在學習程式設計的時候,都有了解過設計模式,通過這些模式讓你找到“封裝變化” 、“物件間鬆散耦合”、“針對介面程式設計”的感覺,從而設計出易維護、易擴充套件、易複用、靈活性好的成語。學好設計模式,培養好面向物件的程式設計思維。 二.簡單工

安卓專案實戰ByeBurger句程式碼實現標題欄、導航欄滑動隱藏

簡介 效果圖 內容View可為:ViewPager中巢狀RecycleView 內容View可為:NestedScrollView包裹TextView 內容View可為:NestedScrollView包裹WebView 如何使用 1.在project的

Scala入門第十篇--Akka實現簡易版的spark通訊框架

本次我們介紹使用Akka實現簡易的Spark通訊框架,主要分為: Akka簡介 提出需求 需求分析 程式碼示例 Akka簡介 Akka基於Actor模型,提供了一個用於構建可擴充套件的(Scalable)、彈性的(Resilient)、快速響應的(Resp

KFC簡單工廠模式實現

在這裡插入程式碼片 ```package domain; 1.KFC package domain; public class KFC { private String name; private int price; public S

Spring工廠模式簡介

工廠模式作用: 核心思想:例項化物件 需求: 1.多例物件的建立 2.有些物件 例如介面/抽象類不能直接例項化 介面–代理 抽象類–建立子類 3.需要對物件進行二次封裝 靜態工廠: 說明: 靜態工廠必須有靜態方法。 呼叫方式:類名.靜態方法 例: (1)

【c++】用工廠模式實現計算器功能(附工廠模式程式碼)

工廠模式 編譯環境:Linux vim DynBase.h #ifndef _DYN_BASE_H_ #define _DYN_BASE_H_ #include <map> #inclu

設計模式() 工廠模式 五種寫法總結

系列開篇瞎BB 設計模式相關的文章學習與總結,一直有意為之,一直又覺得時機不到。 一 是怕自己程式碼經驗還不夠,學習了也不懂,強行理解沒有意義。 二 是怕自己學習了以後總結出來,萬一有不對的地方,誤人子弟。 而在現在的公司摸爬滾打半年後,感覺

使用簡單工廠模式實現四則運算 C++

今天實現了一個簡單工廠模式, 實現四則運算。 說下對簡單工廠的理解, 個人感覺他就是利用一個工廠類的靜態函式獲取一個工廠產品的例項, 在C++中表現就是 獲取一個指向產品的派生類的基類指標, 利用多型 實現具體產品類的呼叫。 ie, 利用工廠類負責建立物件的