GOF:运用共享手艺有用地撑持年夜量细粒度的对象。 - [5 I, m% V, J
诠释一下概念:也就是耸ё仝一个系统中如不美观有多个不异的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。好比说(这里引用GOF书中的例子)一个文本系统,每个字母定一个对象,那么巨细写字母一共就是52 个,那么就要界说 52个对象。如不美观有一个1M的文本,那么字母是何其的多,如不美观每个字母都界说一个对象那么内存早就爆了。那么如不美观若是每个字母都共享一个对象,那么就年夜年夜节约了资本。
& U. ~" P2 @ i1 u7 h1 V) v+ C 在Flyweight模式中,因为要发生各类各样的对象,所以在Flyweight(享元)模式中常呈现Factory 模式。Flyweight的内部状况是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状况的对象。Flyweight模式是一个提高轨范效率和机能的模式,会年夜年夜加速轨范的运行速度.应用场所良多,下面举个例子:
# S( g9 z) a0 u' ` b; C 先界说一个抽象的Flyweight类: package Flyweight;
- F1 ~$ X* o2 n7 Wpublic abstract class Flyweight
- [) h- c4 G" U...
& b& a) j o. ^{
1 D: @/ W. {! x: t4 R public abstract void operation();
9 Q8 j' w. R- U) P$ p ~}//end abstract class Flyweight 在实现一个具体类: package Flyweight;
+ r% S+ i& y& Hpublic class ConcreteFlyweight extends Flyweight) J& L0 C; h5 F/ W$ \2 s/ h1 ^2 _
...
0 k3 w1 c% p/ T* ^8 T' F5 @* o{
6 G% x, z( [* H$ t1 l# Z private String string;4 \9 u! d3 r5 J i ~
public ConcreteFlyweight(String str)* K1 J8 Y* n5 R! ~
...
/ t5 q; w6 i& ~3 O$ N1 ?, y: b {
& q/ @4 B, m/ s+ b8 Y3 u- U string = str;
3 L7 L# c4 y; K, N+ F3 D }//end ConcreteFlyweight(...)
9 @- b; D! j2 p1 G a5 W' k. S6 _1 J public void operation()
$ k" x8 F1 U @7 p ...
C' K. j/ g* B/ V4 }* a% A {" l ?% m8 Q, g& E* `
System.out.println("Concrete---Flyweight : " + string);
! N- |2 B- p" z: c" R# K# R }//end operation()+ e! H! z3 a0 U$ g# H
}//end class ConcreteFlyweight 实现一个工场体例类: package Flyweight;! s! B% r7 D4 x1 u3 `# b
import java.util.Hashtable;
u3 v2 H; k* }public class FlyweightFactory
/ {8 A. [1 d) D' \ p.../ I3 A: w/ k9 K$ x( ^% ^: l! v
{
4 b7 T0 |5 a9 B( n private Hashtable flyweights = new Hashtable();//----------------------------1% y7 R1 E4 \+ p
public FlyweightFactory() ...{}
6 i7 w2 {% e* v public Flyweight getFlyWeight(Object obj)2 j! G; }9 P$ j X
...
( n- { F t8 Z4 m5 p {
8 I, w& {0 F' y Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------22 @% L$ \- |9 S$ ], ?
if(flyweight == null) ...{//---------------------------------------------------35 q( z: ~+ R$ B2 @0 h" q( P
//发生新的ConcreteFlyweight7 A0 s& ?2 H; ^: M6 [( y2 `/ [
flyweight = new ConcreteFlyweight((String)obj);
; o9 z9 Z8 t) L* L4 f& |, z' k, i flyweights.put(obj, flyweight);//--------------------------------------5& x, U4 S1 j1 ^5 }# ?
}* }% g* H1 k1 I) `! w$ p6 q
return flyweight;//---------------------------------------------------------6
t- J+ u9 K3 _8 C7 j: Q& u% ` }//end GetFlyWeight(...): \& }6 F" S7 c3 s! v4 ~
public int getFlyweightSize()5 l6 K6 s; h9 y4 _0 p
...% i1 ] ~" R; V# n! u
{
3 T w! d1 k1 q9 N1 L% A return flyweights.size();+ P( Z [" O: [- p4 h2 t* c
}
, z7 L( Z, X7 k/ L$ s+ r}//end class FlyweightFactory
- X" ]( q: d6 F: y2 e 这个工场体例类很是关头,这里具体诠释一下:- e5 M; U6 `9 h. E. P
在1处界说了一个Hashtable用来存储各个对象;在2处选出要实例化的对象,在6处将该对象返回,如不美观在Hashtable中没有要选择的对象,此时变量flyweight为null,发生一个新的flyweight存储在Hashtable中,并将该对象返回。 |