ホームページ > バックエンド開発 > PHPチュートリアル > PHPデザインパターン FlyWeight(フライウェイトパターン)_PHPチュートリアル

PHPデザインパターン FlyWeight(フライウェイトパターン)_PHPチュートリアル

WBOY
リリース: 2016-07-21 15:28:14
オリジナル
821 人が閲覧しました

フライウェイトパターンは英語で「Flyweight Pattern」と呼ばれます。この言葉は、このパターンがフェザーウェイトパターンまたはフライウェイトモードなどに翻訳される場合にどのように使用されるかを明確に表現するため、フライウェイトパターンをフライウェイトパターンに翻訳した人に非常に感謝します。 . 、このモードを使用する目的を暗黙的に表現することはできますが、依然としてこのモードの鍵を見逃しています。

フライウェイト パターンは次のように定義されます: 共有を使用して、多数の同一のコンテンツ オブジェクトを持つことによるオーバーヘッドを回避します。このオーバーヘッドの最も一般的で直感的なものは、メモリの損失です。フライウェイト モードは、共有方法で多数のきめの細かいオブジェクトを効率的にサポートします。

共有の中心となる概念は名前と定義に反映されています。では、共有を実現するにはどうすればよいでしょうか?すべてのものは異なるが、一定の共通点があることを私たちは知っておく必要があります。同じものだけを共有できるのであれば、フライウェイトモデルは実現不可能であると言えます。したがって、物事の共通点を維持しながら共有するように最善を尽くす必要があります。その個性。これを達成するために、フライウェイト モデルは固有状態と外部状態を区別します。内部の状態は共通性であり、外部の状態は個別性です。

注: 共有オブジェクトは不変でなければなりません。そうでない場合は、すべての変更が発生します (そのような要件がある場合を除く)。

固有の状態はフライウェイト内に保存され、環境の変化によって変化することはなく、共有できます。外部状態は共有できず、環境の変化によって変化するため、外部状態はクライアントによって維持されます(変更されるため)。環境内の原因はクライアントにあります)。それぞれの特定の環境で、クライアントは外部状態をフライウェイトに渡して、さまざまなオブジェクトを作成します。

まず、フライウェイト モードの概要を理解するために、以下のプログラムを見てください。

コードをコピーします コードは次のとおりです:

/**
* フライウェイト モード
*
* フライウェイト テクノロジーを使用して、多数のきめの細かいオブジェクトを効果的にサポートします
*/
class CD
{
private $_title = null;
private $_artist = null; ;
パブリック関数 setTitle($title)
{
$this->title = $title;
パブリック関数 getTitle()
{
return $this->_title
}
パブリック関数 setArtist; )
{
$this->artist = $artist;
public function getArtist($artist)
{
return $this->_artist
}
}
class Artist
{
private $_name; public function __construct( $name)
{
echo "construct ".$name."
";
$this->_name = $name;
public function getName()
return $this-> ;_name;
}
}
class ArtistFactory
{
private $_artists = array();
public function getArtist($name)
{
if(isset($this->_artists[$name] ))
{
return $this->_artists[$name];
} else {
$objArtist = 新しいアーティスト($name);
return $ objArtist;
}
}
}
$objArtistFactory = new ArtistFactory();
$objCD1->setTitle("title1"); >getArtist( 'artist1'));
$objCD2 = 新しい CD();
$objCD2->setArtist($objArtistFactory->getArtist); ));
$objCD3 = 新しい CD();
$objCD3->setArtist($objArtistFactory->getArtist('artist1'));

フライングドルモデルの本質は3つのポイントです:

  1. システムで広く使用されている粒度の細かいオブジェクトの場合、粒度をどの程度細かくするか、そしてその量をどのくらい大きくするかについては、jdk、Integer、Character、String などで使用される flyweight モードを確認してください。これらはすべて最も基本的なデータ型であり、計算に頻繁に関与し、非常に大きくなります。
  2. オブジェクトの内部属性/状態と外部属性/状態を分けます。いわゆる内部状態は、オブジェクトの内部に存在し、環境によって変化しない状態です。あるネチズンはそれをよく言いました、それは区別がつきません。つまり、外部属性を取り除いた後は、オブジェクトの本質的な状態がオブジェクトの本質であり、本質と魂が区別できない限り、オブジェクトも区別できなくなります。同時に、この区別のつかない魂だけが共有できる、これがフライウェイトと訳される理由でもあると思います。外部状態はクライアントによって指定された状態であり、環境によって変化します。Integer の場合、その内部属性は実際にはその値です (もちろん、外部属性はありません)。
  3. フライウェイトの作成を制御するにはファクトリを使用します。フライウェイト オブジェクトはクライアントが自由に作成できません。そうしないと意味がありません。ファクトリは通常、すでに作成されたフライウェイトを保存するためのキャッシュ メカニズムを提供します。

オブジェクト指向は抽象化の問題をうまく解決しますが、実際に実行されているソフトウェア システムでは、オブジェクト指向のコストも考慮する必要があります。フライウェイト パターンはオブジェクト指向のコストを解決します。フライウェイト モードは、オブジェクト共有を使用してシステム内のオブジェクトの数を減らし、それによって粒度の細かいオブジェクトがシステムにもたらすメモリ負荷を軽減します。

フライウェイト モードは、一般的なプロジェクト開発ではあまり使用されませんが、基盤となるシステムの開発では、システム パフォーマンスの問題を解決するためによく使用されます。 Java および .Net の String 型は、flyweight パターンを使用します。文字列オブジェクト s1 が Java または .NET で作成されている場合、次回同じ文字列 s2 が作成されると、システムは s2 の参照を s1 によって参照される特定のオブジェクトにポイントするだけで、メモリ内で同じ文字列の共有が実現されます。 。 s1="abc" 操作が実行されるたびに新しい文字列オブジェクトが作成されると、メモリのオーバーヘッドが非常に大きくなります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/323622.html技術記事フライウェイトパターンは英語で「Flyweight Pattern」といいますが、この言葉がこのパターンの使われ方を端的に表しているので、Flyweight Patternと訳してくださった方にとても感謝しています…
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート