0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AppConfig

Last updated at Posted at 2023-10-09
  • AppConfig という別の設定クラスを作り、実装オブジェクトを生成して接続する責任を持つようにした。

    public static void main(String[] args) {
        // 前
        // MemberService memberService = new MemberServiceImpl();
        // OrderService orderService = new OrderServiceImpl();
        // クライアント オブジェクトが実装オブジェクトの生成、接続、実行のすべての責任を負っている。
        // インターフェースだけでなく、実装クラスにも依存している。
        // 後
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();
        // クライアント オブジェクトは実行する責任のみを担うことになった。
        // => 1.SRP:単一責任原則解決
        // どの実装オブジェクトを生成して接続するかをAppConfigで決定し、
        // クライアント オブジェクトでは修正することがない。
        // =>2. OCP:開放-閉鎖の原則を解決
        // インターフェース(抽象化)のみに依存し、実装クラス(球体科)に依存しない。
        // =>5.DIP:依存関係逆転の原則解決
    
        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);
        
        Order order = orderService.createOrder(memberId, "itemA", 10000);
        System.out.println(order);
        System.out.println(order.calculatePrice());
    }
    
    public class AppConfig {
    
        public MemberService memberService() {
            return new MemberServiceImpl(memberRepository());
        }
    
        public OrderService orderService() {
            return new OrderServiceImpl(memberRepository(), discountPolicy());
        }
    
        public MemberRepository memberRepository(){
            return new MemoryMemberRepository();
        }
    		
        // どの実装オブジェクトを生成して接続するかをAppConfigで決定する。
        public DiscountPolicy discountPolicy(){
        // 前
        // return new FixDiscountPolicy();
        // 後
        return new RateDiscountPolicy();
        }
    
    }
    
    package hello.hellospring.member;
    
    public class MemberServiceImpl implements MemberService{
    
        // 前
        // private final MemberRepository memberRepository = new MemoryMemberRepository();
        // 後
        private final MemberRepository memberRepository;
        public MemberServiceImpl(MemberRepository memberRepository){
            this.memberRepository = memberRepository;
        }
    
        @Override
        public void join(Member member) {
            memberRepository.save(member);
        }
    
        @Override
        public Member findMember(Long memberId) {
            return memberRepository.findById(memberId);
        }
    }
    
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?