1.オブジェクトと依存関係-IoC


1.4制御反転(IoC)


IoCは反転を制御する弱者である.

1.4.1対象工場


現在、UserDaoのクライアントオブジェクトmainには2つの注目点があります.
  • ユーザデータとConnectionMakerインプリメンテーションクラスのオブジェクト
  • を作成する
  • のように作成する2つのオブジェクトは、実行時に接続して使用する(テスト)
  • .
    上の二つの関心事も分ける

    ファクトリ


    定義#テイギ#
  • オブジェクトの作成方法を決定し、オブジェクトを作成したオブジェクトを返します.
    これは,設計モードにおけるファクトリメソッドモードや抽象ファクトリモードとは異なる概念である.
  • 使用目的
  • では、次の役割と責任を2つに分類します.
    -オブジェクトの作成(Data Factory)
    生成オブジェクト
  • (マスター)
  • を使用する.
    UserDaoを作成するファクトリクラス
    public class DaoFactory {
        public UserDao userDao() {
            ConnectionMaker connectionMaker = new DConnectionMaker();
            UserDao userDao = new UserDao(connectionMaker);
    
            return userDao;
        }
    }
    工場のmainを使用するように変更
    public class main {
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
    
            UserDao userDao = new DaoFactory().userDao();
            
            ...
    	}
    }

    設計図としての工場


  • コンポーネント:UserDaoやConnectionMakerなどの実際の論理セクション
  • 設計図:アプリケーションを構成するコンポーネントの構造と関係を定義する
  • 1.4.2利用対象工場


    データファクトリにUserDaoではなく他のDAOの作成機能を追加したらどうなりますか?
    データファクトリにAccountDao、MessageDaoなどを作成する
    public class DaoFactory {
        public UserDao userDao() {
            ConnectionMaker connectionMaker = new DConnectionMaker();
            UserDao userDao = new UserDao(connectionMaker);
    
            return userDao;
        }
    
        public AccountDao accountDao() {
            ConnectionMaker connectionMaker = new DConnectionMaker();
            AccountDao accountDao = new AccountDao(connectionMaker);
    
            return accountDao;
        }
    
        public MessageDao messageDao() {
            ConnectionMaker connectionMaker = new DConnectionMaker();
            MessageDao messageDao = new MessageDao(connectionMaker);
    
            return messageDao;
        }
    }
    に質問
    3つの方法で、接続タグ実装クラスのコード重複を選択して生成します.
    解決策
    重複するConnectionMaker実装クラスを選択し、生成したコードを個別のメソッドとして抽出します.
    public class DaoFactory {
        public UserDao userDao() {
            UserDao userDao = new UserDao(connectionMaker());
    
            return userDao;
        }
    
        public AccountDao accountDao() {
            AccountDao accountDao = new AccountDao(connectionMaker());
    
            return accountDao;
        }
    
        public MessageDao messageDao() {
            MessageDao messageDao = new MessageDao(connectionMaker());
    
            return messageDao;
        }
        
        public ConnectionMaker connectionMaker() {
            // 분리해서 중복을 제거한 ConnectionMaker 타입 오브젝트 생성 코드
        	return new DConnectionMaker();
        }
    }
    効果
  • DAOの種類にかかわらず問題ありません.
  • ConnectionMakerの実装クラスが変更されても、ConnectionMaker()メソッドコードを一度変更するだけでよい.
  • 1.4.3制御権の移転による逆転制御関係


    オブジェクト(Client)は、使用するオブジェクトを自分で選択または作成しません.
    すべての制御権限は、他の特殊なオブジェクト(設計図)に委任されます.

  • UserDaoがどのConnectionMakerインプリメンテーションクラスを使用するかは、Data Factoryによって決定されます.

  • mainは、Data Factoryによって作成され、初期化されて返されるdaoのみを使用できます.
  • IoCのメリットを活用
  • はシンプルなデザインになっています.
  • の柔軟性を追加します.
  • の拡張性が向上しました.
  • IoCはフレームワークを必要とせず,単純なコード設計で利用できる.
    スプリングフレームは、これらIoCを限界まで適用するフレームである.
    ソース:github