C++面接宝典--デザインモデル

3731 ワード

テキストリンク:https://www.nowcoder.com/tutorial/93/2f895548adc24f0b88ffcb01c7973f23
1.どのようなデザインモデルを使ったことがありますか.単例モデルのマルチスレッドセキュリティの問題を紹介します.
一般的な設計モデルは次のとおりです.単一のモデル:(1)コンセプト・シングル・インスタンス・モードは、主にグローバルに使用されるクラスの頻繁な作成と破棄の問題を解決します.シングル・インスタンス・モードでは、クラスが1つのインスタンスしかないことを保証し、独自にインスタンス化し、システム全体にこのインスタンスを提供します.シングル・インスタンス・モードには3つの要素があります.1つは、クラスに1つのインスタンスしかないこと、2つは、このインスタンスを独自に作成すること、3つは、そのインスタンスが行は、このインスタンスをシステム全体に提供します.(2)C++を実現する実現には,局所静的変数により一度だけ初期化するという特徴を利用してオブジェクトを返す2種類がある.もう1つは,グローバルを定義するポインタであり,getInstanceはそのポインタが空であるか否かを判断し,空の場合にオブジェクトをインスタンス化する.(3)メリットとデメリット:メモリに1つのインスタンスしかないため、メモリのオーバーヘッドが削減され、特に頻繁にインスタンスの作成と破棄(管理学院トップページページキャッシュなど)、リソースの多重占有を回避(例えばファイルを書く操作).欠点:インタフェースがなく、継承できず、単一の職責原則と衝突し、1つのクラスは内部論理だけに関心を持つべきで、外でどのようにインスタンス化するかに関心を持たない.(4)シーン使用シーン:一意のシリアル番号、WEB内のカウンタを生産する必要があり、リフレッシュのたびにデータベースに一度追加する必要がなく、I/Oとデータベースの接続など、単一の例で先にキャッシュし、作成したオブジェクトで消費するリソースが多すぎる.
ファクトリモード:(1)コンセプトファクトリモードは主にインタフェース選択の問題を解決する.このモードでは、オブジェクトを作成するインタフェースを定義し、サブクラスがどのファクトリクラスをインスタンス化するかを自分で決定し、その作成プロセスをサブクラスに遅延させる.(2)メリットとデメリットのデカップリング、コードの再利用、機能の変更が容易である.
オブザーバモード:(1)概念定義オブジェクト間の一対多の依存関係であって、1つのオブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知されて自動的に更新される.観察者モードでは観察者と被観察者に分けられ、被観察者が装填変化すると観察者が通知される.主にオブジェクトの状態が他のオブジェクトに変化することを解決するために通知される問題は、観察者が被観察者にコールバック関数を登録したのと同様の実装である.
装飾モード:(1)概念は既に存在するいくつかのクラスを装飾し、それによっていくつかの機能を拡張し、それによって動的に一つのオブジェクトに新しい機能を追加する.デザイナモードは継承の代わりに使用する技術であり、継承によってサブクラスを追加することなくオブジェクトの新しい機能を拡張することができる.継承関係の代わりにオブジェクトの関連関係を使用し、より柔軟になり、同時にタイプ体系の高速化を避ける急速に膨張する.(2)長所と短所長所:装飾類と被装飾類は独立して発展することができ、互いに結合しない.装飾モードは継承された代替モードであり、装飾モードは一つの実現クラスの機能を動的に拡張することができる.短所:多層装飾は比較的複雑である.(3)使用シーン使用シーン:一つのクラスの機能を拡張し、動的に機能を増加し、動的に取り消す.
シングル・インスタンス・モードのマルチスレッド・セキュリティの問題:シングル・インスタンス・モードの実装では、マルチスレッドでは安全ではない場合、複数のインスタンスが同時に作成される可能性があります.解決策は、クラスの構築方法をプライベートメソッドとして定義することであり、他のコードはクラスの構築方法を呼び出すことによってクラスのオブジェクトをインスタンス化することができず、クラスが提供する静的メソッドによってのみクラスの唯一のインスタンスを得ることができる.このクラスには静的メソッドがあり、このメソッドを呼び出すと、クラスが保持する参照が空でない場合にこの参照が返され、クラスが保持する参照が空である場合にクラスのインスタンスが作成され、インスタンスの参照がクラスが保持する参照に与えられます.従って、マルチスレッドでの単一パターンのスレッドセキュリティを保証するために、(1)餓漢式:class loaderメカニズムに基づいてマルチスレッドの同期問題を回避するが、instanceはクラス搭載時にインスタンス化され、ゴミ対象が発生する可能性がある.
public class Singleton{
	private static Singleton sin = new Singleton(); //            
	private Singleton(){}; // private                  new       
	public static Singleton getSin(){ return sin; } //        public  
};

(2)怠け者式:二重ロックメカニズムによりスレッドセキュリティを実現する.
public class Singleton{
	private static Singleton instance;
	private Singleton(){};
	//             
	public static Singleton getInstance(){ 
		if (instance == null){
			synchronized( Singleton.class){
				if (instance == null){
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
};

2.OOPのデザインパターンの5つの原則を教えてください
(1)単一職責原則単一職責には2つの意味があり、1つは同じ職責が異なるクラスに分散することを避けることであり、もう1つは1つのクラスが多すぎる職責を負うことを避けることである.クラスの結合を減らし、クラスの多重性を高める.(2)インタフェース分離の原則は、クライアントが使用できないインタフェースを強制的に実現すべきではないことを示しており、太ったインタフェースの中額メソッドをグループ化し、それを複数のインタフェースで置き換え、各インタフェースはサブモジュールにサービスを提供する.簡単に言えば、単一のインタフェースを使用するよりも複数の専門的なインタフェースを使用するほうがずっとよい.(3)オープン-クローズ原則openモジュールの動作は、硬直化ではなくオープンで、拡張をサポートしなければならない.closedはモジュールの機能を拡張する際に、既存のプログラムモジュールに影響や大規模な影響を及ぼすべきではない.一言で要約すると、一つのモジュールは拡張性の面ではオープンであり、変更性の面では閉鎖すべきである.核心思想は抽象編具体的なプログラミングではなく、プログラムを実行します.(4)置換原則サブタイプは、親タイプを置換し、親クラスが出現できる任意の場所に現れる必要がある.(5)依存逆転原則上層モジュールは下層モジュールに依存すべきではなく、親は子クラスに依存することができず、抽象クラスに依存しなければならない.抽象は具体に依存することができず、具体的には抽象に依存すべきである.
主に継承された設計原則(1)親の方法はすべてサブクラスで実現または書き換えられ、派生クラスはその抽象クラスの生命の方法のみを実現し、余計な方法定義や実現を与えるべきではない.(2)クライアントプログラムでは親オブジェクトのみを使用し、直接サブクラスオブジェクトを使用するべきではなく、実行中のバインドを実現することができる.
3.単一モードの怠け者のロードです.同時アクセスしたらどうしますか?
ロックメカニズムを用いて複数回のアクセスを防止することで、初めて空と判断してロックをかけず、空であればロックをかけて空と判断し、空であればオブジェクトを生成することができる.