合工大很牛很牛牛

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks
Factory Methord的目的就是在“封装对象的创建”的基础上(simple factory, factory methord, abstract factory的前提都是封装对象的创建),让子类来决定对象被如何创建。对比simple factory 是用一个与之assciation的新造的类来专门决定对象该如何被创建,具体见前文《简单工厂》。

仍然是用PizzaStore为例:注意下面的PizzaStore中的createPizza()方法是抽象方法,执行过程有子类来决定!而PizzaStore也因此而是抽象类。



通过NYPizzaStore来创建一个NYCheesePizza的时序图如下:



具体代码如下:
 1package javaapplication18;
 2
 3public class Main
 4{
 5
 6    public static void main(String[] args)
 7    {
 8        PiszzaStore store = new NYPizzaStore();
 9        store.createPizza("CheesePizza");
10        store.orderPizza();
11    }

12}

13

 1package javaapplication18;
 2
 3public abstract class PiszzaStore
 4{
 5
 6    Pizza mPizza;
 7
 8    public PiszzaStore()
 9    {
10    }

11
12    public abstract Pizza createPizza(String pizzaName);
13
14    public Pizza orderPizza()
15    {
16        mPizza.prepare();
17        mPizza.bake();
18        mPizza.cut();
19        mPizza.box();
20        return mPizza;
21    }

22}

23
24

 1package javaapplication18;
 2
 3public class NYPizzaStore extends PiszzaStore
 4{
 5
 6    public NYPizzaStore()
 7    {
 8    }

 9
10    public Pizza createPizza(String pizzaName)
11    {
12        if (pizzaName.equals("CheesePizza"))
13        {
14            mPizza = new NYCheesePizza();
15            System.out.println("NY CheesePizza created.");
16            return mPizza;
17        }

18        else if (pizzaName.equals("ClamPizza"))
19        {
20            mPizza = new NYClamPizza();
21            System.out.println("NY ClamPizza created.");
22            return mPizza;
23        }

24        return null;
25    }

26}

27
28

 1package javaapplication18;
 2
 3public class Pizza
 4{
 5
 6    public Pizza()
 7    {
 8    }

 9
10    public void prepare()
11    {
12        System.out.println("pizza prepared");
13    }

14
15    public void bake()
16    {
17        System.out.println("pizza baked");
18    }

19
20    public void cut()
21    {
22        System.out.println("pizza cut");
23    }

24
25    public void box()
26    {
27        System.out.println("pizza boxed");
28    }

29}

30
31



事实上,所谓的Factory Methord讲白了就是:有些事情,父类故意不干事,让给子类去干。
简化的UML如下:

posted on 2008-05-21 22:47 化的了 阅读(2482) 评论(8)  编辑  收藏 所属分类: 设计模式

Feedback

# re: 工厂方法 Factory Methord 2008-05-21 23:46 Anchor
你好!很高兴看到你的这篇文章..最近也在学这个东东..希望能共同学习..共同交流..我的QQ是494229399  回复  更多评论
  

# re: 工厂方法 Factory Methord 2008-05-22 08:53 ehuan
为什么用的是抽象类,而不是接口?有什么好处吗?
一般书上都是建议用接口,或者再让抽象类继承接口。  回复  更多评论
  

# re: 工厂方法 Factory Methord[未登录] 2008-05-22 10:37 stone7
请问你的UML图用什么工具画的?  回复  更多评论
  

# re: 工厂方法 Factory Methord 2008-05-22 15:19 化的了
@ehuan
接口在英文是interface,其实在设计模式里,java中的abstract class和 interface 都是一种抽象方式。
《head first design pattern》里面把抽象出来的东西都叫做interface,也就说interface是一种方式(把interface理解成为一种概念而不是java的关键字),它包括抽象类和接口。

具体情况时改用抽象类还是接口,要根据上下文环境来决定。因为java里,可以implement多个接口,却只能extends 一个类。

中文书有的可能翻译的不好,或者有的作者就没明白这个道理,所以把抽象类和接口在设计模式内分得很细

不晓得我说的话可够明白。


@stone7
uml 是用netbeans里面的uml工具画的。eclipse的uml2插件实在没它用的爽。
  回复  更多评论
  

# re: 工厂方法 Factory Methord[未登录] 2008-05-22 18:37 apple0668
nb画的UML颜色搭配不错,netbeans很好很强大,做得越来越专业了。  回复  更多评论
  

# re: 工厂方法 Factory Methord 2008-05-28 18:31 wenlin
Factory Methord?
Factory Method  回复  更多评论
  

# re: 工厂方法 Factory Methord 2008-05-30 18:04 化的了
@wenlin
thanks  回复  更多评论
  

# re: 工厂方法 Factory Method 2008-08-06 16:03 chenlh
代码少了
NYCheesePizza
NYClamPizza  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: