没有合适的资源?快使用搜索试试~ 我知道了~
在设计模式中,FactoryMethod也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是FactoryMethod,为什么要用这个模式,如何用Java语言来实现该模式,这就是本文想要带给大家的内容.基本概念FactoryMethod是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到FactoryMethod模式了.简单说来,Fa
资源推荐
资源详情
资源评论
在在Java中应用设计模式中应用设计模式-FactoryMethod
在设计模式中,Factory Method也是比较简单的一个,但应用非常广
泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地
方我们都会看到xxxFactory这样命名的类,那么,什么是Factory Method,为什么要用这个模式,如何
用Java语言来实现该模式,这就是本文想要带给大家的内容.
基本概念
Factory Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例
化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时
我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同
的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这些
实例的具体过程封装起来了,简化了客户端的应用,也改善了程序的扩展性,使得将来可以做最小的
改动就可以加入新的待创建的类. 通常我们将Factory Method作为一种标准的创建对象的方法,当
发现需要更多的灵活性的时候,就开始考虑向其它创建型模式转化
简单分析
图1是Factory Method 模式的结构图,这里提供了一些术语,让我们可以进行更方便的描述:
1. Product: 需要创建的产品的抽象类.
2. ConcreteProduct: Product的子类,一系列具体的产品.
3. Creator: 抽象创建器接口,声明返回Product类型对象的Factory Method.
4. ConcreteCreator: 具体的创建器,重写Creator中的Factory Method,返回ConcreteProduct类
型的实例.
图1: Factory Method 模式结构
由此可以清楚的看出这样的平行对应关系: Product <====> Creator ; ConreteProduct <====>
ConreteCreator
抽象产品对应抽象创建器,具体产品对应具体创建器.这样做的好处是什么呢?为什么我们不直接
用具体的产品和具体的创建器完成需求呢?实际上我们也可以这样做.但通过Factory Method模式
来完成,客户(client)只需引用抽象的Product和Creater,对具体的ConcreteProduct和
ConcreteCreator可以毫不关心,这样做我们可以获得额外的好处:
首先客户端可以统一从抽象创建器获取产生的实例,Creator的作用将client和产品创建过程
分离开来,客户不用操心返回的是那一个具体的产品,也不用关心这些产品是如何创建的.同
时,ConcreteProduct也被隐藏在Product后面,ConreteProduct继承了Product的所有属性,并
实现了Product中定义的抽象方法,按照Java中的对象造型(cast)原则,通过ConcreteCreator
产生的ConcreteProduct可以自动的上溯造型成Product.这样一来,实质内容不同的
ConcreteProduct就可以在形式上统一为Product,通过Creator提供给client来访问.
其次,当我们添加一个新的ConcreteCreator时,由于Creator所提供的接口不变,客户端程序不
会有丝毫的改动,不会带来动一发而牵全身的灾难, 这就是良好封装性的体现.但如果直接用
ConcreteProduct和ConcreteCreator两个类是无论如何也做不到这点的. 优良的面向对象设
计鼓励使用封装(encapsulation)和委托(delegation),而Factory Method模式就是使用了封装
和委托的典型例子,这里封装是通过抽象创建器Creator来体现的,而委托则是通过抽象创建
器把创建对象的责任完全交给具体创建器ConcreteCreator来体现的.
现在,请再回头看看基本概念中的那段话,开始也许觉得生涩难懂,现在是不是已经明朗化了很多.
下面让我们看看在 Java 中如何实现Factory Method模式,进一步加深对它的认识.
具体实施
先说明一点,用Factory Method模式创建对象并不一定会让我们的代码更短,实事上往往更长,我们
也使用了更多的类,真正的目的在于这样可以灵活的,有弹性的创建不确定的对象.而且,代码的可
重用性提高了,客户端的应用简化了,客户程序的代码会大大减少,变的更具可读性.
1. 标准实现: 这里我采用Bruce Eckel 用来描述OO思想的经典例子 Shape.这样大家会比较熟
悉一些.我完全按照图1中所定义的结构写了下面的一段演示代码.这段代码的作用是创建不
同的Shape实例,每个实例完成两个操作:draw和erase.具体的创建过程委托給
ShapeFactory来完成.
1.a 首先定义一个抽象类Shape,定义两个抽象的方法.
abstract class Shape {
// 勾画shape
public abstract void draw();
// 擦去 shape
public abstract void erase();
public String name;
public Shape(String aName){
name = aName;
}
}
1.b 定义 Shape的两个子类: Circle, Square,实现Shape中定义的抽象方法
// 圆形子类
class Circle extends Shape {
public void draw() {
System.out.println("It will draw a circle.");
}
public void erase() {
System.out.println("It will erase a circle.");
}
// 构造函数
public Circle(String aName){
super(aName);
}
}
// 方形子类
class Square extends Shape {
public void draw() {
System.out.println("It will draw a square.");
}
public void erase() {
System.out.println("It will erase a square.");
}
// 构造函数
public Square(String aName){
super(aName);
}
}
1.c 定义抽象的创建器,anOperation调用factoryMethod创建一个对象,并对该对象进行一系
列操作.
abstract class ShapeFactory {
protected abstract Shape factoryMethod(String aName);
// 在anOperation中定义Shape的一系列行为
public void anOperation(String aName){
Shape s = factoryMethod(aName);
System.out.println("The current shape is: " + s.name);
s.draw();
s.erase();
}
}
1.d 定义与circle和square相对应的两个具体创建器CircleFactory,SquareFactory,实现父类
的methodFactory方法
剩余8页未读,继续阅读
资源评论
weixin_38651540
- 粉丝: 5
- 资源: 914
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功