ð Adapterãã¿ãŒã³ã«ãããçµåãšå€éç¶æ¿
Bridge/strategyã®æãã®æãŠ
ã¢ããã¿ãšããªããžã®éããããããšé£çµãåã®ããªããžãæã®ã¢ããã¿ãŒ
GoFã®Adapterã¯ã€ã³ã¿ãŒãã§ãŒã¹ããã³ã¬ãŒã¿ãŒãšã®éã
Adapterã¯æ¢åã®ã¯ã©ã¹ã§ã¯ã€ã³ã¿ãŒãã§ãŒã¹ãåããªããšãã«å©çšãããšãªã£ãŠãããããªããžãè€éåããæ§é ãæŽçããªããããã«å©çšããã®ãšéã£ãŠãAdapterã¯æ¢åã®ã¯ã©ã¹ããã®ãŸãŸäœ¿ãããã«äœ¿ãã
AdapterãšDecoratorå®è£ ã®éãã Javaã§èŠæ¯ã¹ã
Adapterã®æ¬è³ªã¯ã€ã³ã¿ãã§ãŒã¹ã®äœ¿ãæ¹ã«ãã
interface ProductPrice{
public int getPrice();
}
class Product{
private int cost;
public int getCost(){
return cost;
}
}
class ProductAdapter implements ProductPrice{
private Product product = new Product();
public int getPrice(){
return product.getCost();
}
}
Decoratorã«ã€ããŠã¯å®çŸ©ãèŠãªããŠããœãŒã¹ã®ããã¡ãã¿ãã°ãªããšãªãã©ããªãã®ã ãã¯ããããšæãã
public class DecoratorTest{
public static void main(String[] argv){
System.out.println(
new WholesalePrice(
new DoublePrice(
new WholesalePrice(
new DoublePrice(
new PrimePrice(120)
)
,80
)
)
,200
)
.getValue()
);
}
}
ç¶æ¿é¢ä¿ãããã®ã§ãååž°çã«çµåããŠããããšããã®ãèŠãŠãããããã
ããªããžãšã¢ããã¿ãŒã®éã
ããšããšBridgeãšStrategyã¯åœ¢ãäžç·ã§ãæ§é ãšæ¯ãèããšãã察ç«è»žãããçµåãããŒããšãªã£ãŠãããDecoratorãééæ§ã®é«ãååž°çãªçµåãããŠã¿ããã®ãšã¯éã£ãŠãAdapterã¯ãããŸã§ãã®åœ¢è·¡ãæ®ããŠãéœåçã«äœ¿ããflyweightã¯æ¯ãèãã®Strategyãšé¢ä¿ãæ·±ããStrategyãæ¯ãèããªãã°ãDecoratorã¯èç©(ã¬ãã)ãšããæ Œèšãããã
Flyweightéç Žå£çãªã¯ã©ã¹
å®è¡éšã®ãœãŒã¹ã ãæåãããŠããã ã
public class FlyweightTest {
public static void main(String[] args) {
StampFactory factory = new StampFactory();
List<Stamp> stamps = new ArrayList<Stamp>();
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ãŠ'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
stamps.add(factory.get('ã'));
for(Stamp s : stamps){
s.print();
}
}
}
ãã©ã€çŽãã¯ãµãŒ
GoFã§ã¯ããã¹ããšãã£ã¿ã®äŸãã§ãŠãããå å·¥ãç·šéã«ã€ããããŸãæåã®ãããªããŒã¿ãããªããžã§ã¯ãã«ãªã£ãŠããå Žåããã®ãŸãŸäœããšèšå€§ã«ã ã¶ãããŒã¿ãã§ãŠãããFlyWeightïŒãã©ã€çŽãã¯ãµãŒïŒã¯ãã®åã®éããã¡ã¢ãªéã®ã ã¶ã€ããæããŠããããããããåããã«ããååã°ã£ããã ãªGoFã
ãªãã»ã©ãflywieghtã¯ã¢ã¿ãããæãã®ãã¿ãŒã³ã ãã¡ã¢åãæãåºãã
ã€ãã¥ãŒã¿ãã«ãšããè¡šçŸããã
ãã©ã€çŽãã¯ãµãŒããååããšã£ãflywieghtã¯ãååããçšæãªæ°ã¯ããããå®çšé¢ã§ã¯ãã¶ã€ã³ãã¿ãŒã³ã«ããŠã¯çããåãããããããæœè±¡çãªè°è«ã«ãé¥ãããšãªããã¡ã¢ãªãããã©ãŒãã³ã¹ã®è©±ãã§ããè°è«ãããããã
get: function (make, model, processor) {
if (!flyweights[make + model]) {
flyweights[make + model] =
new Flyweight(make, model, processor);
}
return flyweights[make + model];
},
æç²ã ããflyweightsãšããé åãèŠãŠãåããã®ãå ¥ã£ãŠããã°ãã®ãŸãŸè¿ããããªããã°Flyweightã§æ°ããããŒã¿ãäœã£ãŠãããå®éã®ã³ãŒãã¯FlyWeightFactoryãšããããã·ã¥å ã§è¡ãããã
Javaã®äŸã¯wikipediaã«ããã
Stamp get(char type){
Stamp stamp = this.pool.get(type);
if(stamp == null) {
stamp = new Stamp(type);
this.pool.put(type, stamp);
}
return stamp;
}
åºæ¬ã¯åããFlyweightèªäœãããã§ã¯ã¹ã¿ã³ããåºçŸå¯èœæ§ãä»ã®ãµã³ãã«ãèŠãŠåãã£ãã
ã»ãœãŒã¹å ã«CHACHEãšãã³ã¡ã³ãããã
ã»ãªããžã§ã¯ãã®æç¡ã確èªããããã§ãç¡ãã£ãããã¥ãŒããŠãã
ã»getãšãããããååãã€ããŠãã
ã»ã³ã¡ã³ãã«ã€ãã¥ãŒã¿ãã«ãšãæžããŠãã
ãšãªãã°ãFlyweightããïŒããšå«ãã§ãããã»
ã¹ãã©ããžãšã®é¡äŒŒæ§
shipping.setStrategy(ups);
log.add("UPS Strategy: " + shipping.calculate(package));
shipping.setStrategy(usps);
log.add("USPS Strategy: " + shipping.calculate(package));
shipping.setStrategy(fedex);
log.add("Fedex Strategy: " + shipping.calculate(package));
Bridge/strategyããã®Decorator,Adapterã¯çµåãšããããŒã¯ãŒããããããééæ§ãšãæ§é ãšç«ã¡æ¯ãèããªã©ã«ãã£ãŠé¢é£ã¥ããããšãã§ããããflightweightã¯ãšãã«é¢ä¿ããªãã
ãŸãäºèšãããæ Œèšã§GoFã®flyweightsã¯ãããããããã
ããŸãïŒã¢ããã¿ãŒäºçš®é¡
ãé¡ãèŽããŸã