-
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); } }
More than 1 year has passed since last update.
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme