来自:http://blog.csdn.net/yzxz/article/details/4601152
工厂方法UML图:
抽象工厂UML图:
---------------------------------
对于java来说,你能见到的大部分抽象工厂模式都是这样的:
它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。
比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。
这样A和B就是工厂,对应于抽象工厂;
每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;
用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)
所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
---------------------------------
“抽象工厂”模式依赖于“工厂方法”模式的。因此,抽象工厂强调的是前面的动词“抽象”,也就是说,你将工厂方法模式中的工厂方法抽象出来的那个"动作或设计"就是“抽象工程”模式了。
---------------------------------
factory method针对的是一个产品等级结构
abstract factory是面向多个产品等级结构的
---------------------------------
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
---------------------------------
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
具体例子:
1.简单工厂:
- package com.lucius.creational.patterns.simpleFactoryPattern;
- public interface Icar{
- void run();
- }
- public class BMWCar implements ICar{
- public void run(){
- System.out.println("BMWCar run!");
- }
- }
- public class BenzCar implements ICar{
- public void run(){
- System.out.println("BenzCar run!");
- }
- }
- public class Driver{
- public enum carType{
- BMW,
- Benz
- }
- public static ICar DriverCar(String carType){
- switch(carType){
- case BMW :
- return new BMWCar();
- case Benz :
- return new BenzCar();
- }
- }
- public class client{
- public static void main(String[] args){
- ICar myCar = Driver.DriverCar("Benz");
- myCar.run();
- }
- }
- }
心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:
- package com.lucius.creational.patterns.factoryPattern;
- public interface ICar{
- public void run();
- }
- public class BMWCar implements ICar{
- public void run(){
- System.out.println("BMWCar run!");
- }
- }
- public class BenzCar implements ICar{
- public void run(){
- System.out.println("BenzCar run!");
- }
- }
- public interface IDriver{
- public Icar driverCar();
- }
- public class BMWCarDriver implements IDriver{
- public ICar driverCar(){
- return new BMWCar();
- }
- }
- public class BenzCarDriver implements IDriver{
- public ICar driverCar(){
- return new BenzCar();
- }
- }
- public class client{
- public static void main(String[] args){
- IDriver myDriver = new BenzCarDriver();
- Icar myCar = myDriver.driverCar();
- myCar.run();
- }
- }
心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.
3.抽象工厂:
- package com.lucius.creational.patterns.AbstractFactoryPattern;
- public interface IBusinessCar{
- public void run();
- }
- public interface ISportCar{
- public void run();
- }
- public class BMWBusinessCar implements IBusinessCar{
- public void run(){
- System.out.println("BMWBusinessCar run!");
- }
- }
- public class BenzBusinessCar implements IBusinessCar{
- public void run(){
- System.out.println("BenzBusinessCar run!");
- }
- }
- public class BMWSportCar implements ISportCar{
- public void run(){
- System.out.println("BMWSportCar run!");
- }
- }
- public class BenzSportCar implements ISportCar{
- public void run(){
- System.out.println("BenzSportCar run!");
- }
- }
- public interface IDriver{
- IBusinessCar BusinessCarDriver();
- ISportCar SportCarDriver();
- }
- public class BMWCarDriver implements IDriver{
- public IBusinessCar BusinessCarDriver(){
- return new BMWBusinessCar();
- }
- public ISportCar SportCarDriver(){
- return new BMWSportCar();
- }
- }
- public class BenzCarDriver implements IDriver{
- public BenzBusinessCar BusinessCarDriver(){
- return new BenzBusinessCar();
- }
- public BMWSportCar SportCarDriver(){
- return new BMWSportCar();
- }
- }
- public class client{
- public static void main(String[] args){
- IDriver myDriver = new BenzCarDriver();
- Icar myCar = myDriver.SportCarDriver();
- myCar.run();
- }
- }
心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.
相关推荐
抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式
IOS 设计模式抽象工厂实例Demo IOS 设计 模式 抽象 工厂
设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 要您一个资源分,也算是对我的尊重,谢谢下载。
设计模式之工厂方法、简单工厂、抽象工厂
设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)
设计模式--抽象工厂模式实现多数据库连接 设计模式,.net设计模式,抽象工厂
设计模式-抽象工厂模式(讲解及其实现代码)
设计模式 - 抽象工厂模式
工厂方法与抽象工厂设计模式,这份文档介绍了这种设计模式
单例设计模式、工厂设计模式和抽象工厂模式是常见的软件开发设计模式。这些设计模式提供了一些有用的思想和实现方式,可以帮助开发人员在设计和实现复杂的软件系统时,更加灵活和高效地进行编程。 单例设计模式是一...
设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂...
NET设计模式之抽象工厂模式[归纳].pdf
设计模式——抽象工厂模式源码,设计模式——抽象工厂模式源码
深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂(加类图)
通过C++实现了简单工厂模式、工厂模式、抽象工厂模式三大设计模式的经典案例。
JAVA设计模式之抽象工厂模式,一个不错的列子,逻辑比好清晰,让你更好的理解抽象工厂
java设计模式之抽象工厂模式实例,希望对大家有所帮助。
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
抽象工厂模式 JAVA设计模式
设计模式系列之抽象工厂模式