🏓 デザインモード#1:一輪、ストライプ🏓


😽 リファレンス😽


headfirst designPatternを参考に勉強しました.
以下のブログと記事を参照してください.
gmlwjd9405.github.io
OmarElGabry/DesignPatterns
quanke/design-pattern-java-source-code
yaboong.github.io

😼 ソースコード😼


https://github.com/bo-yoon/DesignPattern

😼 せっけいげんり😺

  • アプリケーションから変更された部分を見つけ、変更されていない部分から分離します.
  • すなわち、変更された部分は別々に抜去され、パッケージ化される.これにより、後で変更する部分に影響を及ぼさずに、その部分だけを修正または拡張することができます.
  • ではなくインタフェースに従ってプログラミングします.
  • の親タイプに従ってプログラミングします.
  • 継承と比較して構成を使用する.
  • AにはBがあり、
  • 相互作用するオブジェクト間では、できるだけ緩やかな結合の設計を採用しなければならない.
  • クラスは拡張に対して開いている必要がありますが、コード変更に対しては閉じている必要があります.
  • 抽象化されたものに依存させ、構想類に依存しない.
  • 最低知識原則-本当の親友と話すだけ
  • ハリウッドの原則:まず連絡しないでください.ご連絡いたします.
  • 依存性腐敗を防止することができる.
  • 単一キャラクター原則=レベルを変える理由はただ一つ.
  • ▼▼▼長所▼▼

  • モードでのコミュニケーションは、専門用語の共有に加えて、より多くのメリットがあります.
  • 簡単な言葉は多くのことを話すことができます.
  • モードレベルで会話を行い、より多くの設計に集中することができる.
  • ▼一回り▼▼

  • シングルループ・モードでは、インスタンスに任意の場所でアクセスするためのクラス・インスタンスのみが作成されます.
    モード
  • では、グローバル変数を使用せずにオブジェクトを作成し、作成したオブジェクトをどこでも参照できます.
  • あるものは、複数の人が1つのリソースを共有するときに使用されるモードです.
    共有の欠点は、スレッドが安全ではないことです.
    つまり、仕事の過程で手を出すことができます.

  • ウィキペディアソース
    解決策
  • 静的変数が作成されると、直ちにオブジェクトが割り当てられ、初期化(Eager)
  • が開始する.
  • オブジェクトを同期的に割り当てる方法(同期)
  • ▼▼▼普通単頓▼▼▼▼▼▼

    
    package singleton;
    
    public class Refrigerator {
    	// 냉장고는 공통 자원	
        private static Refrigerator ref = null;
        
        private Refrigerator() {}  // 생성자가	 private
        
        public static Refrigerator getInstance() {
        	if(ref == null) {
        			ref = new Refrigerator();
        	}
        	return ref;
        }
        
    	public void display() {
    		System.out.println("냉장고 공유");
    		
    	}
    }

    ▼▼▼▼▼

    
    package singleton;
    
    public class EagerRefrigerator {
    	// 냉장고는 공통 자원	
        private static EagerRefrigerator ref = new EagerRefrigerator();
        
        private EagerRefrigerator() {}  // 생성자가	 private
        
        public static EagerRefrigerator getInstance() {
    
        	return ref;
        }
        
        public void display() {
        	System.out.println("Eager 냉장고 공유");
      
        }
    }
    

    ▼▼▼同期▼▼▼

    package singleton;
    
    public class SyncRefrigerator {
    	// 냉장고는 공통 자원	
        private static SyncRefrigerator ref = null;
        
        private SyncRefrigerator() {}  // 생성자가	 private
        
        public synchronized static SyncRefrigerator getInstance() {
        	if(ref == null) {
        			ref = new SyncRefrigerator();
        	}
        	return ref;
        }
        
        public void display() {
        	System.out.println("Sync 냉장고 공유");
      
        }
    }
    

    ▼戦略モード▼▼▼

  • の親に対応する抽象クラスまたはインタフェースを作成し、それを継承してサブクラスを作成します.宣言すると、必要なサブクラスをオブジェクトに割り当てて、サブクラスで定義された動作を持つことができます.この原理を使用すると、動作を実行中にいつでも変更できます.
  • の下のコードによると、宣言されたユーザーはプログラムの実行中にいつでもカリブ湾や室内彩育館に行くことができる.
  • すなわち、あるユーザの動作を容易に変更することができる.

    画像のソース
    欠点:重複コードの生成
    
    package strategy;
    
    public interface Exercise {
    	
    	public void acting(int hours);
    }
    
    
    package strategy;
    
    public class Climbing implements Exercise {
    	
    	private String place; // 장소
    	
    	public Climbing(String place) {
    		this.place = place;
    	}
    	
    	@Override
    	public void acting(int hours) {
    		System.out.println(place + "에서 " +hours + "시간 동안 클라이밍함 "  );
    	}
    	
    }
    
    package strategy;
    
    public class Swimming implements Exercise {
    	
    	private String place;
    	private String things;
    	
    	public Swimming(String place, String things) {
    		this.place = place;
    		this.things = things;
    	}
    	
    	@Override
    	public void acting(int hours) {
    		System.out.println(hours +"시간 동안 " + place + "에서 " +things +
    				"을 가지고 수영");
    	}
    }
    
    
    package strategy;
    
    public class Swimming implements Exercise {
    	
    	private String place;
    	private String things;
    	
    	public Swimming(String place, String things) {
    		this.place = place;
    		this.things = things;
    	}
    	
    	@Override
    	public void acting(int hours) {
    		System.out.println(hours +"시간 동안 " + place + "에서 " +things +
    				"을 가지고 수영");
    	}
    }
    
    
    package strategy;
    
    public class Child extends User {
    	
    	@Override
    	public void display() {
    		System.out.println("나는 어린이");
    	}
    }
    
    package strategy;
    
    public class Player extends User{
    	
    	@Override
    	public void display() {
    		System.out.println("나는 수영선수!");
    	}
    
    
    }
    
    package strategy;
    
    public class Main {
    
    	public static void main(String [] args) {
    		
    		User user = new Child(); // 학생 사용자 선언
    		
    		user.display();
    		
    		user.setExercise(new Swimming("케리비안베이","튜브"));
    		user.doAct(5);
    		
    		user.setExercise(new Climbing("실내 체육관"));
    		user.doAct(2);
    		
    	}
    }