ホームページ  >  記事  >  バックエンド開発  >  PHP デザインパターン FlyWeight (フライウェイトパターン)

PHP デザインパターン FlyWeight (フライウェイトパターン)

怪我咯
怪我咯オリジナル
2017-07-14 10:26:141410ブラウズ

フライウェイト テクノロジーを使用して、多数のきめの細かいオブジェクトを効果的にサポートし、必要な友人がそれを参照できるようにします。

フライウェイトパターン英語名は「Flyweight Pattern」です。フライウェイトパターンをフライウェイトパターンに翻訳すると、この単語がどのように使用されるかを明確に表現するため、マグニチュード モデルまたはフライウェイト モデルは、このモデルの使用目的を暗黙的に表現できますが、このモデルの鍵がまだ抜けています。

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

フライウェイト モードの利点:

1) フライウェイト モードの利点は、メモリ内のオブジェクトの数を大幅に削減できるため、同じオブジェクトまたは類似のオブジェクトのコピーが 1 つだけメモリに保存されることです。

2) フライウェイト モードの外部状態は比較的独立しており、内部状態に影響を与えないため、フライウェイト オブジェクトを異なる環境で共有できます。

フライウェイト モードの欠点:

1) フライウェイト モードはシステムをより複雑にし、内部状態と外部状態の分離を必要とするため、プログラムのロジックが複雑になります。

2) オブジェクトを共有可能にするために、フライウェイト モードはフライウェイト オブジェクトの状態を外部化する必要があり、外部状態を読み取ると実行時間が長くなります。


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

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

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

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

<?php 
/** 
* 享元模式 
* 
* 运用享元技术有效的支持大量细粒度的对象 
*/ 
class CD 
{ 
private $_title = null; 
private $_artist = null; 
public function setTitle($title) 
{ 
$this->_title = $title; 
} 
public function getTitle() 
{ 
return $this->_title; 
} 
public function setArtist($artist) 
{ 
$this->_artist = $artist; 
} 
public function getArtist($artist) 
{ 
return $this->_artist; 
} 
} 
class Artist 
{ 
private $_name; 
public function construct($name) 
{ 
echo "construct ".$name."<br/>"; 
$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 = new Artist($name); 
$this->_artists[$name] = $objArtist; 
return $objArtist; 
} 
} 
} 
$objArtistFactory = new ArtistFactory(); 
$objCD1 = new CD(); 
$objCD1->setTitle("title1"); 
$objCD1->setArtist($objArtistFactory->getArtist(&#39;artist1&#39;)); 
$objCD2 = new CD(); 
$objCD2->setTitle("title2"); 
$objCD2->setArtist($objArtistFactory->getArtist(&#39;artist2&#39;)); 
$objCD3 = new CD(); 
$objCD3->setTitle("title3"); 
$objCD3->setArtist($objArtistFactory->getArtist(&#39;artist1&#39;));

flyweight モードの本質は 3 つのポイントです:

  1. システムで広く使用されている粒度の細かいオブジェクト。jdk で使用される flyweight モードを見てください。 jdk では、Integer、Character、String などはすべて、最も基本的な データ型 であり、非常に大きいです。

  2. オブジェクトの内部属性/状態と外部属性/状態を分けます。いわゆる内部状態は、オブジェクトの内部に存在し、環境によって変化しない状態です。の状態、つまり、同じ種類のオブジェクト間には違いはありません。魂と魂が区別できない限り、そのオブジェクトの本質的な状態はそのオブジェクトの魂です。そうすると、物体も区別がつかなくなり、同時に未分化な魂だけが存在することになるので、Flyweightはフライウェイトと訳されるのだと思います。外部状態はクライアントによって指定された状態であり、環境によって変化します。整数の場合、その内部属性は実際には値です (もちろん外部属性はありません)。フライウェイトの作成はファクトリによって制御されます。フライウェイト オブジェクトはクライアントが自由に作成できないため、そうでなければ意味がありません。ファクトリは通常、すでに作成されたフライウェイトを保存するためのキャッシュ メカニズムを提供します。

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

フライウェイト モードは、一般的なプロジェクト開発ではあまり使用されませんが、システムのパフォーマンスの問題を解決するために、基盤となるシステムの開発ではよく使用されます。 Java および .Net の String 型は、flyweight パターンを使用します。 Java または .NET で string オブジェクト s1 が作成されている場合、次回同じ文字列 s2 が作成されると、システムは s2 の

reference

を s1 によって参照される特定のオブジェクトにポイントするだけで、共有が実現されます。メモリ内の同じ文字列。 s1="abc" 操作が実行されるたびに新しい文字列オブジェクトが作成されると、メモリのオーバーヘッドが非常に大きくなります。

以上がPHP デザインパターン FlyWeight (フライウェイトパターン)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。