比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现c(它的某个具体子类Q的对象都可以生产鼠标和键盘Q但可能工厂A生的是|技的键盘和鼠标Q工厂B是微软的?
q样A和B是工厂Q对应于抽象工厂Q?
每个工厂生的鼠标和键盘是产品Q对应于工厂ҎQ?
用了工厂Ҏ模式Q你替换生成键盘的工厂方法,可以把键盘从罗技换到微Y。但是用了抽象工厂模式,你只要换家工厂,可以同时替换鼠标和键盘一套。如果你要的产品有几十个Q当然用抽象工厂模式一ơ替换全部最方便Q这个工厂会替你用相应的工厂ҎQ?
所以说抽象工厂像工厂Q而工厂方法则像是工厂的一U品生产线
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />
“抽象工厂”模式依赖?#8220;工厂Ҏ”模式的。因此,抽象工厂的是前面的动?#8220;抽象”Q也是_你将工厂Ҏ模式中的工厂Ҏ抽象出来的那?动作或设?是“抽象工程”模式了?br />
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />
factory method针对的是一个品等U结?nbsp;
abstract factory是面向多个品等U结构的
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />
工厂Ҏ模式Q一个抽象品类Q可以派生出多个具体产品cR?nbsp;
一个抽象工厂类Q可以派生出多个具体工厂cR?nbsp;
每个具体工厂cd能创Z个具体品类的实例?nbsp;
抽象工厂模式Q多个抽象品类Q每个抽象品类可以z出多个具体品类?nbsp;
一个抽象工厂类Q可以派生出多个具体工厂cR?nbsp;
每个具体工厂cd以创建多个具体品类的实例?nbsp;
区别Q工厂方法模式只有一个抽象品类Q而抽象工厂模式有多个?br />
工厂Ҏ模式的具体工厂类只能创徏一个具体品类的实例,而抽象工厂模式可以创建多个?br />
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />
1.如果一个后花园只种蔬菜c?那么q单工厂就可以?
2.如果后花园蔬菜品U繁?得用工厂Ҏ才可?把共有的东西抽象出来.
3.如果要扩大后花园的规?比如一个在北方,一个在南方,q样工厂Ҏ无法实C,应当用抽象工厂,把各U各L植物,又组成一个后花园.
所以我个h认ؓ,单工厂是一个工厂只生一cȝ产品,面对的是具体的类,工厂Ҏ是可以生产不同的产品,把公qҎ抽象出来,然后q行创徏各种各样的?抽象工厂把几U品划出共同的东西,把相互依赖的对象抽象出来,只要实现q些接口可以得C同的产品.
具体例子:
1.单工?
心得:优点是符合了开?闭原则(OCP),从整体上q看不出什么缺?
3.抽象工厂:
ҎcM如下的模P
那么发现一个问题,不同地域的汽车却在一个工厂中出现Q这是不合乎常理的,因ؓ北京奥_在北京分厂创建,上v奥_在上分厂创建,q样才对?br />
所以如果遇到分“大系”来创建对象的时候,抽象工厂Ҏ是肯定要使用的时候了。这里的大系指的是从地域上来分?br />
q个例子应该以“用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对?#8221;
比如在玩“极品飞R”q款游戏Q每个地囑֤都有造R的工厂,每个造R的工厂都因ؓ有造R的档ơ不同而划分ؓ高车厂Q低UR厂,那么q样的场景正是应
用抽象工厂的好时机,再来理解一下这句话“用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对?#8221;Q用抽象造R工厂来定义具体造R工厂的抽象,而由?
体的造R工厂来创建汽车,q就是抽象工厂与工厂Ҏ的不同,工厂Ҏ中对象的创徏是由工厂Ҏ来确定的Q创建的对象都是不分cdƈ且实C个接口的Q而抽?
工厂是在工厂方法的基础上对创徏车的对象的行行分c,比如北京车厂Q上R厂等?br />
?strong>抽象工厂模式解释?br />
cdQ创建模?br />
提供一个创Zpd相关或相互依赖对象的接口Q而无需指定他们具体的类?br />
?strong>抽象工厂模式UML?/strong>?br />
?strong>抽象工厂模式-JAVA代码实现?br />
新徏抽象工厂接口Q?/p>
新徏抽象工厂接口的高URadv工厂实现c:
新徏抽象工厂接口的普通Rlow工厂实现c:
上面已经有抽象工厂和具体工厂的实现类了?br />
新徏汽R接口Q?/p>
新徏汽R父类Q?/p>
新徏大众高车:
新徏大众普通RQ?/p>
新徏奥_高车:
新徏奥_普通RQ?/p>
新徏客户端运行类Q?/p>
E序q行l果如下Q?/p>
抓一阎宏的文字:
新徏发布通知实现c:
新徏观察者接口:
新徏观察者实现类Q?/p>
新徏客户端运行类Q?/p>
E序q行l果如下Q?/p>
新徏赛R操作的外观类Q?/p>
新徏客户端运行类Q?/p>
E序q行l果如下Q?/p>
新徏晴天地图c:
新徏阴天地图c:
新徏高画质builder建造者类Q?/p>
新徏低画质builder建造者类Q?/p>
新徏客户端运行类Q?/p>
E序q行l果如下Q?/p>
从程序中可以看到Q徏造者模式将不变的创E进行封装,创徏的过E与main分法q行分离Q这样内部的创徏q程和表示层的代码q行分开Q有利于?
E功能上的修攏V另外可以发玎ͼ代码的设计和功能有些cM于facade外观模式Q区别在于,建造者模式目的在于以相同的构E通过不同的徏造者得
C同的l果Q而外观模式ƈ不需要不同的建造者,也不希望得到不同的结果,只是单的几个接口合q成高的一个接口,不媄响原有的l果Q目的是使调用变
得更加容易?/p>
本程序中?个徏造者:高画者徏造者和低画质徏造者,它们都封装了创徏地图的过E,q个q程很固定,但通过不同的徏造者类可以q回不样式的地图Q徏造者规定了对象创徏的过E,比如高画质的建造者的创徏q程为:
map_interface_ref.create_weather();
map_interface_ref.create_house();
map_interface_ref.create_tree();
map_interface_ref.create_way();
必须得执?个方法才可以创徏一个高画质的地图,如果不用徏造者模式,直接调用mapcȝcreate_xxxxҎQ如果create_xxxx
Ҏ有几十个Q那么很有可能就把其中的某些Ҏ忘记调用而媄响最l地囄效果了,所以我们要使用建造者模式来规定地图创徏的过E,q就是一?#8220;行ؓ守则
”?/p>
新徏U色仪表盘的赛R实现c:
新徏蓝色仪表盘的赛R实现c:
新徏客户端运行类Q?/p>
E序q行l果如下Q?/p>
新徏奥_汽R的实现类Q?/p>
在奥q汽车实现类中需要注意的是将原来protectedcd的cloneҎ要变成publicQ这h可以对外公开Q可以被调用Q将U密公开化?br />
新徏奥_汽R的配件轮胎类Q?/p>
新徏客户端运行类Q?/p>
E序q行l果如下Q?/p>
然后新徏一个奥q汽车子c:
然后再新Z个装饰者父c:
然后再新饰者子c:U色火焰装饰者类Q?/p>
然后再新饰者子c:紫色霞光装饰者类Q?br />
新徏一个运行类Q?/p>
E序q行l果如下Q?br />
新徏一个people人类Q具有买车的行ؓQ所以实现接口buy_car_packageQ?/p>
peoplecM能拥有RQ必ȝqproxy代理cȝ认证Q符合条件之后才可以拥有车辆Q新Z个代理,q个代理cL考察当前的people是否有资D行买车:
最后创Z个客LQ用来模拟买车的行ؓQ?/p>
E序q行l果如下Q?/p>
新徏1个汽车信息的基类Q?/p>
新徏奥_汽R实现c:
新徏大众汽R实现c:
新徏一个汽车工厂接口:
新徏一个创建奥qR的汽车工厂实现类Q?/p>
新徏一个创建大众R的汽车工厂实现类Q?/p>
客户端运行程序代码:
E序q行l果如下Q?/p>