/* ĠDescription Ċ Ġ* Ċ Ġ* ĠThe Ġabstract Ġfactory Ġpattern Ġis Ġused Ġto Ġprovide Ġa Ġclient Ġwith Ġa Ġset Ċ Ġ* Ġof Ġrelated Ġor Ġdepend ant Ġobjects . ĠThe Ġ" family " Ġof Ġobjects Ġcreated Ċ Ġ* Ġby Ġthe Ġfactory Ġare Ġdetermined Ġat Ġrun - time . Ċ Ġ*/ Ċ Ċ /* ĠAbstract Product Ġ*/ Ċ interface ĠOperation System Ċ Ċ /* ĠConcrete Product Ġ*/ Ċ class ĠWindows Ġ: ĠOperation System Ċ Ċ class ĠLinux Ġ: ĠOperation System Ċ Ċ /* ĠAbstract Factory Ġ*/ Ċ abstract Ġclass ĠOperation System Factory < T Ġ: ĠOperation System > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠOperation System > Ġcreate Factory () Ġ= Ġwhen Ġ( T :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindows :: class Ġ-> ĠWindows Factory () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinux :: class Ġ-> ĠLinux Factory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġcreate (): ĠT Ċ } Ċ Ċ /* ĠConcrete Factory A Ġ*/ Ċ class ĠWindows Factory Ġ: ĠOperation System Factory < Windows >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate () Ġ= ĠWindows () Ċ } Ċ Ċ /* ĠConcrete Factory B Ġ*/ Ċ class ĠLinux Factory Ġ: ĠOperation System Factory < Linux >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate () Ġ= ĠLinux () Ċ } Ċ Ċ /* ĠUsage Ġ*/ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġwindows Factory Ġ= ĠOperation System Factory . create Factory < Windows >() ĊĠĠĠ Ġprintln (" Windows : Ġ${ windows Factory . create () }") ĊĊĠĠĠ Ġval Ġlinux Factory Ġ= ĠOperation System Factory . create Factory < Linux >() ĊĠĠĠ Ġprintln (" Linux : Ġ${ linux Factory . create () }") Ċ } Ċ Ċ /* ĠOutput Ċ Ġ* Ċ Ġ* ĠWindows : ĠWindows @ 7 2 3 2 7 9 cf Ċ Ġ* ĠLinux : ĠLinux @ 1 0 f 8 7 f 4 8 Ċ Ġ*/ Ċ