
3åéããã°ã©ãã³ã°è¬åº§ 第10å: ãªããžã§ã¯ãäœãã®ãå·¥å ŽãïŒïœãã¶ã€ã³ãã¿ãŒã³ãšãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ïœ
ç»å Žäººç©ïŒ
ãã£ããå çïŒéç§°:å çïŒïŒ ãªããžã§ã¯ãæåãã¹ã¿ãŒãæ®æ®µã¯åªãããããŸã«ãŠãŒã¢ã¢ã亀ããªãã解説ã
ããã婿ïŒéç§°:ãããåïŒïŒ ããã°ã©ãã³ã°ãå§ããã°ããã®è¥æãçŽ æŽãªçåãæããããã®ãåŸæã
ãããåïŒ å çïŒååã¯ã€ã³ã¿ãŒãã§ãŒã¹ãšæœè±¡ã¯ã©ã¹ã§ãèšèšã®çŽæäºã«ã€ããŠåŠã³ãŸããïŒããã°ã©ã ããããã«ä¿ã€ããã®ã«ãŒã«ãã£ãŠæãã§ãããïŒ
å çïŒ ãããããããåïŒãã®éãïŒã€ã³ã¿ãŒãã§ãŒã¹ãæœè±¡ã¯ã©ã¹ã¯ãã¯ã©ã¹éã®é¢ä¿æ§ãæç¢ºã«ãã倿Žã«åŒ·ãããã°ã©ã ãäœãããã®åŒ·åãªéå ·ã ã仿¥ã¯ããããã®éå ·ãããã«å¹æçã«äœ¿ãããã®ããã¶ã€ã³ãã¿ãŒã³ããšããèãæ¹ãç¹ã«ããªããžã§ã¯ãäœãã®ãå·¥å ŽãããšãåŒã°ãããã¿ãŒã³ã«ã€ããŠåŠãã§ãããã
ãããåïŒ ãã¶ã€ã³ãã¿ãŒã³ïŒå·¥å ŽïŒãªãã ããããååã§ããïŒ
å çïŒ ããã ãããã¶ã€ã³ãã¿ãŒã³ã¯ããœãããŠã§ã¢éçºã§ããçŽé¢ããåé¡ã«å¯ŸããŠã**ãããããã°ããŸãããããšãããçµéšã«åºã¥ãããåå©çšå¯èœãªè§£æ±ºçã**ã®ããšãªãã ã建ç¯ã«ããããèšèšã®åãã®ãããªãã®ã ãšæãã°ããã
ãã¶ã€ã³ãã¿ãŒã³ãšã¯ïŒïœãè¯ãèšèšãã®ç¥æµè¢ïœ
å çïŒ ãã¶ã€ã³ãã¿ãŒã³ã¯ã1994幎ã«åºçããããGoFïŒGang of FourïŒããšåŒã°ãã4人ã®èè ã«ããããã¶ã€ã³ãã¿ãŒã³ããšããæ¬ã§äœç³»åãããã®ãå§ãŸããªãã ã圌ãã¯ããªããžã§ã¯ãæåã®åªããèšèšã«ã¯å ±éã®ããã¿ãŒã³ããããããšãçºèŠããããã23çš®é¡ã«åé¡ããŠç޹ä»ããã
ãããåïŒ 23çš®é¡ãïŒãããªã«ãããããããã§ããïŒ
å çïŒ ããã ãããããããç¹å®ã®èšèšäžã®åé¡ã解決ããããã®ãåããæäŸããŠãããã ããã¶ã€ã³ãã¿ãŒã³ãåŠã¶ããšã§ã
ãè¯ãèšèšãã®åŒãåºããå¢ãã: ãŒãããèšèšãèããã®ã§ã¯ãªããå®çžŸã®ãã解決çãé©çšã§ããã
éçºè éã®å ±éèšèªã«ãªã: ããã®éšåã¯ãã¡ã¯ããªãŒãã¿ãŒã³ã§ãããããšèšãã°ãçãåãèšèšãã€ã¡ãŒãžã§ããã
倿Žã«åŒ·ãããã°ã©ã ãäœãã: ãã¿ãŒã³ã¯æè»æ§ãæ¡åŒµæ§ãé«ããããã«èšèšãããŠããããšãå€ãã
å çïŒ ä»æ¥ã¯ããã®äžã§ãç¹ã«ãªããžã§ã¯ãã®çæã«é¢ããéèŠãªãã¿ãŒã³ã®äžã€ãããã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ïŒFactory Method PatternïŒãã«ã€ããŠèŠãŠãããã
ãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ãšã¯ïŒïœãªããžã§ã¯ãäœãã®ãå·¥å Žãïœ
å çïŒ ãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ã¯ããã®åã®éãããªããžã§ã¯ããçæããåŠçãããµãã¯ã©ã¹ã«ä»»ãããããã®ãã¿ãŒã³ã ããŸãã§ãå·¥å Žãã®ããã«ãå ·äœçãªè£œåïŒãªããžã§ã¯ãïŒã®äœãæ¹ããå°éã®éšçœ²ïŒãµãã¯ã©ã¹ïŒã«ä»»ããã€ã¡ãŒãžã ãã
ãããåïŒ ãªããžã§ã¯ããäœãã®ããå¥ã®ã¯ã©ã¹ã«ä»»ãããã§ããïŒãªãã§ãããªããšãããã§ããïŒ
å çïŒ è¯ãçåã ïŒãããŸã§ã®ããã°ã©ã ã§ã¯ããªããžã§ã¯ããäœããšãã¯ãnew ã¯ã©ã¹å()ããšçŽæ¥æžããŠããããïŒ
Java
// çŽæ¥ãªããžã§ã¯ããçæããäŸ
Dog myDog = new Dog();
Cat myCat = new Cat();
å çïŒ ãã®æžãæ¹ã ãšããããDogã¯ã©ã¹ã®äœãæ¹ãããCatã¯ã©ã¹ã®äœãæ¹ããå€ãã£ãããæ°ããçš®é¡ã®åç©ïŒäŸãã°LionïŒã远å ããããããã³ã«ãnew Dog()ãnew Cat()ãšæžããŠããå šãŠã®å Žæãä¿®æ£ããå¿ èŠãåºãŠãããããããªããããã¯ãããã°ã©ã ã倧ãããªããšå€§å€ãªããšã«ãªãã
å çïŒ ãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ã¯ããã®ããªããžã§ã¯ãçæã®åŠçããããããå©çšããåŽïŒã¯ã©ã€ã¢ã³ãã³ãŒãïŒããåãé¢ãããšã§ã以äžã®ã¡ãªããããããããã ã
æè»æ§ã®åäž: ã¯ã©ã€ã¢ã³ãã³ãŒãã¯ãå ·äœçãªã¯ã©ã¹åãç¥ããªããŠããªããžã§ã¯ããçæã§ããããã«ãªãã
æ¡åŒµæ§ã®åäž: æ°ããçš®é¡ã®ãªããžã§ã¯ãã远å ããéã«ãæ¢åã®ã¯ã©ã€ã¢ã³ãã³ãŒãã倿Žããå¿ èŠããªããæ°ãããå·¥å Žãã远å ããã ãã§æžãã
çµå床ã®äœäž: ãªããžã§ã¯ããå©çšããåŽãšããªããžã§ã¯ããçæããåŽã®äŸåé¢ä¿ãç·©ããã«ãªãã
ãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ã®äŸ
å çïŒ åç©ã®äŸã§èããŠã¿ãããåç©ãçæãããå·¥å Žããäœãã€ã¡ãŒãžã ã
Java
// ã¹ããã1: çæãããªããžã§ã¯ãã®å
±éã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©
interface Animal {
void makeSound();
}
// ã¹ããã2: å
·è±¡ã¯ã©ã¹ïŒå
·äœçãªè£œåïŒãå®è£
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("ã¯ã³ïŒ");
}
}
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("ãã£ãŒïŒ");
}
}
// ã¹ããã3: æœè±¡ãã¡ã¯ããªãŒã¯ã©ã¹ãå®çŸ©
// ããã§ããã¡ã¯ããªãŒã¡ãœããããæœè±¡ã¡ãœãããšããŠå®£èšãã
abstract class AnimalFactory {
// ããããã¡ã¯ããªãŒã¡ãœããïŒæœè±¡ã¡ãœããïŒ
// ãã®ã¡ãœããã¯ãAnimalã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããªããžã§ã¯ããè¿ãããšãçŽæãã
public abstract Animal createAnimal();
// å
±éã®åŠçïŒãã³ãã¬ãŒãã¡ãœããçãªèŠçŽ ïŒ
// äŸãã°ãçæããåç©ã«å
±éã®åæèšå®ãè¡ããªã©ãçæåŸã®å
±éåŠçãããã«èšè¿°ã§ãã
public void prepareAnimal() {
Animal animal = createAnimal(); // ãã¡ã¯ããªãŒã¡ãœãããåŒã³åºããŠãªããžã§ã¯ããçæ
animal.makeSound(); // çæãããåç©ã«äœãããã
System.out.println("åç©ãæºåã§ããŸããã");
}
}
// ã¹ããã4: å
·è±¡ãã¡ã¯ããªãŒïŒå
·äœçãªå·¥å ŽïŒãå®è£
// åãã¡ã¯ããªãŒããç¹å®ã®çš®é¡ã®Animalãªããžã§ã¯ããçæãã責任ãæã€
class DogFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog(); // Dogãªããžã§ã¯ããçæ
}
}
class CatFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat(); // Catãªããžã§ã¯ããçæ
}
}
// ã¹ããã5: ã¯ã©ã€ã¢ã³ãã³ãŒãïŒãªããžã§ã¯ããå©çšããåŽïŒ
public class FactoryMethodExample {
public static void main(String[] args) {
System.out.println("--- Dogã®æºå ---");
// DogFactoryã䜿ã£ãŠDogãªããžã§ã¯ããçæããæºååŠçãå®è¡
// ããã§ã¯createAnimal()ãçŽæ¥åŒã³åºãäŸ
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal(); // createAnimal()ã䜿ã£ãŠDogãäœããã
dog.makeSound();
System.out.println("\n--- Catã®æºå ---");
// CatFactoryã䜿ã£ãŠCatãªããžã§ã¯ããçæããæºååŠçãå®è¡
AnimalFactory catFactory = new CatFactory();
Animal cat = catFactory.createAnimal(); // createAnimal()ã䜿ã£ãŠCatãäœããã
cat.makeSound();
// äŸãã°ãæ°ããåç©ïŒLionïŒã远å ãããå Žå
// Lionã¯ã©ã¹ãšLionFactoryã¯ã©ã¹ã远å ããã ãã§ãæ¢åã®ã¯ã©ã€ã¢ã³ãã³ãŒãïŒãã®mainã¡ãœããïŒ
// ã倿Žããå¿
èŠã¯ãªããïŒAnimalFactoryåã®å€æ°ã䜿ã£ãŠprepareAnimal()ãåŒã¶éãïŒ
System.out.println("\n--- å
±éã®æºåã¡ãœããã®å©çšïŒå®è·µçãªäœ¿ãæ¹ïŒ---");
// prepareAnimal()ã¡ãœããã¯ãå
éšã§createAnimal()ãåŒã³åºã
// ã¯ã©ã€ã¢ã³ãã¯ãã®ã¡ãœãããåŒã³åºãã ãã§ãå
·äœçãªçæåŠçãæèããªããŠæžã
dogFactory.prepareAnimal();
catFactory.prepareAnimal();
}
}
ãããåïŒ ããŒïŒnew Dog()ãšãnew Cat()ã£ãŠçŽæ¥æžããã«ãcreateAnimal()ã£ãŠããã¡ãœããã§ãªããžã§ã¯ããäœã£ãŠãïŒãããAnimalFactoryã£ãŠæœè±¡ã¯ã©ã¹ããã£ãŠããããç¶æ¿ããDogFactoryãCatFactoryãå ·äœçãªãªããžã§ã¯ããäœã£ãŠããã§ããïŒãããªããããAnimalã®äœãæ¹ãå€ãã£ãŠããDogFactoryã®äžã ãçŽãã°ããããæ°ããåç©ãå¢ããŠãAnimalFactoryãå®è£ ããæ°ããå·¥å Žã¯ã©ã¹ãäœãã°ããã ããªãã§ããïŒ
å çïŒ ãã®éãïŒã¯ã©ã€ã¢ã³ãã³ãŒãïŒFactoryMethodExampleã®mainã¡ãœããïŒã¯ãå ·äœçãªDogFactoryãCatFactoryãç¥ã£ãŠããããã©ãçæããããªããžã§ã¯ããDogãªã®ãCatãªã®ãã¯ãAnimalã€ã³ã¿ãŒãã§ãŒã¹ãšããŠæ±ã£ãŠãããããã«ãããã¯ã©ã€ã¢ã³ãã³ãŒãã¯ãã©ããªåç©ãäœãããããã«äŸåããããåç©ãäœãããããšããäºå®ã«ã ãäŸåããããã«ãªããã ã
å çïŒ ãããããã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ãããªããžã§ã¯ãäœãã®å·¥å ŽããšåŒã°ããçç±ã§ãããããã°ã©ã ã®æè»æ§ãšæ¡åŒµæ§ãé«ãã匷åãªä»çµã¿ãªãã ã
仿¥ã®ãŸãšãïŒ
ãã¶ã€ã³ãã¿ãŒã³:
ãœãããŠã§ã¢éçºã§ããçŽé¢ããåé¡ã«å¯Ÿãããåå©çšå¯èœãªè§£æ±ºçãã®éãŸãã
ãè¯ãèšèšãã®ç¥æµè¢ã§ãããéçºè éã®å ±éèšèªãšãªãã
ãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³:
ãªããžã§ã¯ãã®çæåŠçãããµãã¯ã©ã¹ã«ä»»ãããã¶ã€ã³ãã¿ãŒã³ã
ç®ç: ãªããžã§ã¯ãçæã®åŠçãã¯ã©ã€ã¢ã³ãã³ãŒãããåãé¢ããæè»æ§ãšæ¡åŒµæ§ãé«ããã
ã¡ãªãã:
ã¯ã©ã€ã¢ã³ãã³ãŒãã¯å ·äœçãªã¯ã©ã¹åãç¥ããªããŠããªããžã§ã¯ããçæã§ããã
æ°ããçš®é¡ã®ãªããžã§ã¯ãã远å ããéã«ãæ¢åã®ã¯ã©ã€ã¢ã³ãã³ãŒãã倿Žããå¿ èŠããªãã
ãªããžã§ã¯ããå©çšããåŽãšçæããåŽã®çµå床ãäœäžããã
ä»çµã¿: ãªããžã§ã¯ããçæããæœè±¡ã¡ãœããïŒãã¡ã¯ããªãŒã¡ãœããïŒãæœè±¡ãã¡ã¯ããªãŒã¯ã©ã¹ã§å®çŸ©ãããããç¶æ¿ããå ·è±¡ãã¡ã¯ããªãŒã¯ã©ã¹ãå ·äœçãªãªããžã§ã¯ããçæããã
ãããåïŒ å çã仿¥ã¯ãã¶ã€ã³ãã¿ãŒã³ãšãã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ã«ã€ããŠããããããåãããŸããïŒãªããžã§ã¯ãã®äœãæ¹ã«ããããªã«è³¢ãæ¹æ³ããããªããŠãã³ã£ããã§ãïŒããã§ããã£ãšå€æŽã«åŒ·ãããã°ã©ã ãæžããããªæ°ãããŸãïŒ
å çïŒ ãã®èª¿åã ããããåïŒãã¶ã€ã³ãã¿ãŒã³ã¯ããŸãã«ãå 人ãã¡ã®ç¥æµãã®çµæ¶ã ããã¡ã¯ããªãŒã¡ãœãããã¿ãŒã³ã¯ããã®äžã§ãæãåºæ¬çã§ãã䜿ããããã®ã®äžã€ã ããæ¬¡åã¯ããªããžã§ã¯ãæåã®èšèšã«ãããããäžã€ã®éèŠãªæŠå¿µããã¿ããªã§äœ¿ãå ±éã®éå ·ããšãèšããstatic修食åãšãŠãŒãã£ãªãã£ã¯ã©ã¹ã«ã€ããŠåŠãã§ãããïŒ
ãããåïŒ å ±éã®éå ·ïŒãªãã ã䟿å©ããã§ãïŒæ¥œãã¿ã§ãïŒããããšãããããŸããïŒ
次åïŒç¬¬11å: ã¿ããªã§äœ¿ãå
±éã®éå
·ïœstaticãšãŠãŒãã£ãªãã£ã¯ã©ã¹
#ãªããžã§ã¯ãæå #ããã°ã©ãã³ã°åå¿è #Java #ã¯ã©ã¹ãšã¡ãœãã #ããã°ã©ãã³ã°åŠç¿ #å ¥é