FlyWeight-デザインパターン
Flyweightモードは主に、作成されるオブジェクトの数を減らしてメモリ使用量を減らし、パフォーマンスを向上させるために使用されます。このタイプのデザインパターンは、オブジェクトの数を減らし、アプリケーションに必要なオブジェクト構造を改善する方法を提供する構造パターンです。
フライ級モデルとは何ですか?
Flyweightモード、共有は共有、要素はオブジェクトです。Flyweightモードの一般的な理解は、メモリ使用量を削減してパフォーマンスを向上させるために、特定の手段で何度も使用されるオブジェクトの共有を実現することです。
ねえ、それはシングルトンパターンのように聞こえませんが、そうではありません、シングルトンパターンは1つのオブジェクトのみを共有することであり、フライウェイトパターンは1つのインスタンスのみで複数のオブジェクトを共有することであり、これらのインスタンスは同じ状態特性を持っています。
フライウェイトパターンの構造
一般に、Flyweightパターンを実装するには、次の部分を実装する必要があります。
-
Flyweight抽象クラス
Flyweightが外部状態を受け入れて動作できる、すべての具象フライ級クラスのスーパークラスまたはインターフェース。 -
ConcreteFlyweightクラス
は、Flyweightスーパークラスを継承するか、Flyweightインターフェイスを実装し、その内部状態用のストレージスペースを追加します。 -
FlyweightFactoryクラス
主にFlyweightの適切な共有を保証するために、Flyweightオブジェクトを作成および管理するために使用されるFlyweightファクトリ。ユーザーがFlyweightを要求すると、FlyweightFactoryオブジェクトは作成されたインスタンスを提供するかインスタンスを作成します。 -
クライアント
テスト操作の実行に使用されるクラス。 -
外部状態のクラス(Userクラスなど)
は、通常、フライウェイトパターンで内部状態と外部状態に分けられます。内部状態は共有できる部分であり、外部状態はオブジェクトが依存できるマークを指します。環境によって変化し、共有できない状態です。 -
概略クラス図
ケースデモンストレーション
現在ウェブサイトに記事がある場合は、ニュース、ブログ、WeChatアプレットなどのチャネルで公開する必要がありますが、これらの記事を読むユーザーは1人だけではなく、読むチャネルも異なるため、ユーザーがウェブサイトやブログを作成するとき、他のユーザーがユーザーの特定の使用法に従って共有するためのチャネルを作成するだけで済みます。
実装手順
Flyweight Factoryでセットを定義することにより、オブジェクトプールのテクノロジーが実現されます。ユーザーが特定のオブジェクトを必要とする場合は、最初にそのオブジェクトがプールに存在するかどうかを判断します。存在する場合は、オブジェクトプールから直接取得して使用できます。便宜上、オブジェクトが作成され、オブジェクトプールに追加されます。
コードデモ
Flyweightの親クラスのWebサイト
package com.design_patterns.flyweight;
//享元类的父类WebSite
public abstract class WebSite {
//定义抽象方法
public abstract void use(User user);
}
コンクリートフライ級クラスConcreteWebSite
package com.design_patterns.flyweight;
public class ConcreteWebSite extends WebSite {
private String type = ""; //网站发布的形式(类型)
private User user = null;
//构造方法
public ConcreteWebSite(String type){
this.type = type;
}
@Override
public void use(User user) {
setUser(user);
System.out.println("网站发布的形式为" + type +
"---->使用者(" + user.getName() + ")");
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
FlyweightファクトリクラスWebSiteFactory
package com.design_patterns.flyweight;
import java.util.HashMap;
/**
* 网站工厂类, 根据需求返回一个具体的网站
*/
public class WebSiteFactory {
private HashMap<String,ConcreteWebSite> pool = new HashMap<String, ConcreteWebSite>();
/**
* 根据网站的类型,返回一个网站,如果没有就创建一个网站,并放入到池中,并返回
* @param type
* @return
*/
public WebSite getWebSiteCategory(String type){
if(!pool.containsKey(type)){
//就创建一个网站,并将其放入池中
pool.put(type,new ConcreteWebSite(type));
}
return (WebSite)pool.get(type);
}
/**
* 获取网站分类的总数
* (池中有多少个网站类型)
* @return
*/
public int getWebSiteCount(){
return pool.size();
}
}
外部状態クラスユーザー
package com.design_patterns.flyweight;
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
テストクラスクライアントクライアント
package com.design_patterns.flyweight;
public class Client {
public static void main(String[] args) {
//创建一个工厂
WebSiteFactory webSiteFactory = new WebSiteFactory();
//客户要一个以新闻形式发布的网站
WebSite webSite = webSiteFactory.getWebSiteCategory("新闻");
//客户要一个以博客形式发布的网站
WebSite webSite1 = webSiteFactory.getWebSiteCategory("博客");
//客户要一个以博客形式发布的网站
WebSite webSite2 = webSiteFactory.getWebSiteCategory("博客");
//客户要一个以微信小程序形式发布的网站
WebSite webSite3 = webSiteFactory.getWebSiteCategory("微信小程序");
//客户要一个以微信小程序形式发布的网站
WebSite webSite4 = webSiteFactory.getWebSiteCategory("微信小程序");
//客户要一个以微信小程序形式发布的网站
WebSite webSite5 = webSiteFactory.getWebSiteCategory("微信小程序");
webSite.use(new User("Tom"));
webSite1.use(new User("tom"));
webSite2.use(new User("Jack"));
webSite3.use(new User("jack"));
webSite4.use(new User("HaHa"));
webSite5.use(new User("XiXi"));
System.out.println("\n网站的分类共---->" + webSiteFactory.getWebSiteCount() + "个");
}
}
要約する
Flyweightは、共有オブジェクトを使用してメモリ使用量を最小限に抑え、できるだけ多くの同様のオブジェクトと情報を共有します。繰り返しのために許容できないほど大量のメモリを使用する多数のオブジェクトに適しています。
さて、内部状態を共有し、独立した外部状態を区別しましょう。これはフライ級モードです。さあ、友達~~~