三种工厂模式以及它们之间的关系
来源:互联网 发布:网络教育学位证好拿吗 编辑:程序博客网 时间:2024/05/29 16:26
转自 http://blog.sina.com.cn/s/blog_b35e31b90101glhs.html
三种工厂模式以及它们之间的关系
(2013-08-29 16:09:06)简单工厂
工厂方法
抽象工厂
区别
联系
分类: 设计模式本文是转的
一、引子
二、分类
工厂模式在《Java与模式》中分为三类:
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
两者皆可,在本文使用《Java与模式》的分类方法。下面来看看这些工厂模式是怎么来“治病”的。
三、简单工厂模式
简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
1)
2)
3)
来用类图来清晰的表示下的它们之间的关系(如果对类图不太了解,请参考我关于类图的文章):
那么简单工厂模式怎么来使用呢?我们就以简单工厂模式来改造暴发户坐车的方式——现在暴发户只需要坐在车里对司机说句:“开车”就可以了。
//抽象产品角色
public interface Car{
public void drive();
}
//具体产品角色
public class Benz implements Car{
public void drive()
System.out.println("Driving Benz ");
}
}
public class Bmw implements Car{
public void drive()
System.out.println("Driving Bmw ");
}
}
。。。(奥迪我就不写了:P)
//工厂类角色
public class Driver{
//工厂方法.注意
//欢迎暴发户出场......
public class Magnate{
这便是简单工厂模式了。怎么样,使用起来很简单吧?那么它带来了什么好处呢?
四、工厂方法模式
你应该大致猜出了工厂方法模式的结构,来看下它的组成:
1)
2)
3)
4)
用类图来清晰的表示下的它们之间的关系:
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!
//抽象产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,这里略。
//抽象工厂角色
public interface Driver{
}
public class BenzDriver implements Driver{
}
public class BmwDriver implements Driver{
return new Bmw();
}
//应该和具体产品形成对应关系...
//有请暴发户先生
{
}
可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。
五、小结
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口。那我们是否一定要在代码中遍布工厂呢?大可不必。也许在下面情况下你可以考虑使用工厂方法模式:
1)
2)
简单工厂模式与工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品对象创建条件的改变必然会引起工厂角色的修改。
六、抽象工厂模式
图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzSportsCar也是一个产品族。
可以说,抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象
而且使用抽象工厂模式还要满足一下条件:
1)
2)
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
1)
2)
3)
4)
类图如下:
看过了前两个模式,对这个模式各个角色之间的协调情况应该心里有个数了,我就不举具体的例子了。只是一定要注意满足使用抽象工厂模式的条件哦。
抽象工厂示例::
- //
产品 Plant接口 - public
interface Plant //标志接口{ } - //具体产品PlantA,PlantB
- public
class PlantA implementsPlant { - public
PlantA () { - System.out.println("create
PlantA );!" - }
- public
void doSomething() { - System.out.println("
PlantA );do something ..." - }
- }
- public
class PlantB implementsPlant { - public
PlantB () { - System.out.println("create
PlantB );!" - }
-
- public
void doSomething() { - System.out.println("
PlantB );do something ..." - }
- }
- //
产品 Fruit接口 - public
interface Fruit { } - //具体产品FruitA,FruitB
- public
class FruitA implementsFruit { - public
FruitA() { - System.out.println("create
FruitA );!" - }
- public
void doSomething() { - System.out.println("
FruitA );do something ..." - }
- }
- public
class FruitB implementsFruit { - public
FruitB() { - System.out.println("create
FruitB );!" - }
- public
void doSomething() { - System.out.println("
FruitB );do something ..." - }
- }
- //
抽象工厂方法 - public
interface AbstractFactory { - public
Plant createPlant(); - public
Fruit createFruit(); - }
- //具体工厂方法
- public
class FactoryA implementsAbstractFactory { - public
Plant createPlant() { - return
new PlantA(); - }
- public
Fruit createFruit() { - return
new FruitA(); - }
- }
- public
class FactoryB implementsAbstractFactory { - public
Plant createPlant() { - return
new PlantB(); - }
- public
Fruit createFruit() { - return
new FruitB(); - }
- }
- //调用工厂方法
- public
Client { -
public method1() { -
AbstractFactory instance = new FactoryA(); -
instance.createPlant(); -
} - }
抽象工厂模式与工厂方法模式的区别
可以这么说,工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂方法模式的一种推广。
(1)、其实工厂方法模式是用来创建一个产品的等级结构的,而抽象工厂模式是用来创建多个产品的等级结构的。工厂方法创建一般只有一个方法,创建一种产品。抽象工厂一般有多个方法,创建一系列产品。
(2)、工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
简而言之->
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
- 三种工厂模式以及它们之间的关系
- 类、对象,以及它们之间的关系
- CPU、内存、硬盘、指令以及它们之间的关系
- java设计模式---三种工厂模式之间的区别
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 几种排序方式以及它们之间的比较
- GNU、GPL、LGPL 、GFDL和MPL,它们和源代码以及商业销售之间的关系
- Thread,Looper,Handler,Message,MessageQueue原理机制以及它们之间的关系
- 工厂模式,简单工厂模式,抽象工厂模式三者之间的区别
- 各种字符串以及它们之间的转换
- HeapAlloc和GlobalAlloc以及VirtualAlloc三者之间的关系
- HeapAlloc和GlobalAlloc以及VirtualAlloc三者之间的关系
- Swift语法08.字典
- [Android] Notification.setLatestEventInfo()方法被移除的问题
- Vi命令详解
- fedy - formerly Fedora Utils
- hdu 3763 CD
- 三种工厂模式以及它们之间的关系
- c++ 写 php 扩展
- 解决window.location.href不跳转,无反应,不执行的问题
- 多态易错题5
- 页面刷新回显checkbox按钮
- svn每天工作流程和解决办法
- 深度学习之caffe Matlab接口
- weiApi——返回Json
- 人与人之间的交往艺术