フライウェイト パターンは構造パターンです
概要: 共有テクノロジーを使用して、多数のきめの細かいオブジェクトを効果的にサポートします
フライウェイト パターン:
共有テクノロジーを使用して、多数のきめの細かいオブジェクトを効果的にサポートします
フライウェイト パターン 変更されるのはオブジェクトのストレージ オーバーヘッドです
フライウェイト モデルの主な役割:
抽象フライウェイト (フライウェイト) ロール: このロールは、すべての具体的なフライウェイト クラスのスーパー クラスであり、必要なパブリック インターフェイスを指定します。これらのクラスに対して実装されます。アウトバウンド状態を必要とするこれらの操作は、ビジネス
Concrete Flyweight (ConcreteFlyweight) ロールを呼び出すことでパラメーターとして渡すことができます。Flyweight インターフェイスを実装し、内部状態 (存在する場合) のストレージ スペースを引き出します。 ConcreteFlyweight オブジェクトは共有可能である必要があります。保存する状態は内部である必要があります
UnsharedConcreteFlyweight ロール: すべての Flyweight サブクラスを共有する必要はありません。 Flyweight により共有が可能になりますが、共有が強制されるわけではありません
Flyweight Factory (FlyweightFactory) ロール: Flyweight ロールの作成と管理を担当します。このロールは、フライウェイト オブジェクトがシステムによって適切に共有されることを保証する必要があります
クライアント (クライアント) ロール: このロールは、すべてのフライウェイト オブジェクトへの参照を維持する必要があります。このロールは、すべてのフライウェイト オブジェクトの外部状態を単独で保存する必要があります
フライウェイト モードの利点:
フライウェイト モードはメモリ内のオブジェクトの数を大幅に削減できます
フライウェイト モードの欠点:
フライウェイト モードはシステムをより複雑にします
フライウェイト モードはフライウェイト オブジェクトの状態を外部化し、外部状態を読み取ることで実行時間がわずかに長くなります。
フライウェイト モードが適用されるシナリオ:
次の条件が当てはまる場合は、フライウェイト モードを使用します:
1 アプリケーションは、大きなオブジェクトの数
2 これは完全に多数のオブジェクトの使用が原因であり、ストレージのオーバーヘッドが大きくなります
3 オブジェクトの状態のほとんどは外部状態に変更できます
4オブジェクトは削除され、使用できるオブジェクトは比較的少数です 共有オブジェクトは多くのオブジェクトのグループを置き換えます
5 アプリケーションはオブジェクトの識別に依存しません
フライウェイト モードおよびその他のモード:
シングルトン モード (シングルトン): クライアントが参照したいと考えていますフライウェイト オブジェクト (ファクトリ オブジェクトを通じて作成または取得されます) はい、クライアントはフライウェイト オブジェクトを参照するたびに、同じファクトリ オブジェクトを通じて必要なフライウェイト オブジェクトを参照できます。したがって、クライアントが 1 つのファクトリ インスタンスのみを参照できるように、フライウェイト ファクトリをシングルトン モードで設計できます。すべてのフライウェイト オブジェクトはファクトリ オブジェクトによって均一に管理されるため、クライアント側で複数のファクトリ オブジェクトを参照する必要はありません。シンプルなフライウェイト モードであっても、複合フライウェイト モードのフライウェイト ファクトリー ロールであっても、シングルトン モードとして設計でき、結果には影響しません。
コンポジット モード: コンポジット フライウェイト モードは、実際にはシンプル フライウェイト モードとコンポジット モードを組み合わせたものです。単純なフライウェイト オブジェクトはリーフ オブジェクトとして使用して共有でき、複合フライウェイト オブジェクトはブランチ オブジェクトとして使用できるため、複合フライウェイト ロールに集約管理メソッドを追加できます
/**
* 抽象的なフライ級キャラクター
*/
抽象クラス Flyweight{
抽象パブリック関数操作($state);
}
/**
* フライ級の具体的な役割
*/
クラス ConcreteFlyweight extends Flyweight {
private $_intrinsicState = null;
/**
* @param $state 内部状態
*/
public function __construct($state){
$this->_intrinsicState = $state;
}
public 関数操作( $state) {
echo 'ConcreteFlyweight 操作、固有の状態 = ' . $this->_intrinsicState
.php
/**
* 共有されない特定のフライウェイト。クライアントはそれらを直接呼び出します
*/
class UnsharedConcreteFlyweight extends Flyweight {
private $_intrinsic状態 = null ;
/**
* コンストラクター
* @param string $state 内部状態
*/
public function __construct($state) {
$this ->_intrinsicState = $state;
}
public functionoperation($state) {
echo ' sharedconcecreteflyight操作= ' **
* フライング ダラー ファクトリーのキャラクター
*/
class FlyweightFactory{
private $_flyweights;
public function __construct() {
$this->_flyweights = array();
}
public function getFlyweight($state ){
if(isset($this->_flyweights[$state])){
return $this->_flyweights[$state];
}
return $this->_flyweights[$state] ] = new ConcreteFlyweight($state);
}
}
/**
* フライングドルモード
*/
public function actionFlyweight(){
Yii::import('ext.flyweight.*');
$flyweightFactory = new FlyweightFactory();
$flyweightFactory-> getFlyweight('状態 A');
$flyweightFactory->operation('他の状態 A');
$flyweightFactory = new FlyweightFactory();
$flyweightFactory->getFlyweight('状態 B');
$flyweightFactory->operation('他の状態 B');
$flyweightFactory = new FlyweightFactory();
$flyweightFactory->getFlyweight('状態 C');
$flyweightFactory->operation('他の状態 C');
/* 不共有の对象,单独调用 */
$uflyweight = new UnsharedConcreteFlyweight('状態 A');
$uflyweight->operation('他の状態 A');
}