码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式_创建型模式——工厂方法

时间:2015-04-16 14:21:01      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:设计模式   工厂方法   创建型模式   面向对象   

工厂方法(Factory Method):工厂方法模式属于类的创建型模式。在工厂方法模式中,父类负责定义创建产品对象的工厂接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类。

 

abstract Product factoryMethodString type

abstract:工厂方法是抽象的,依赖子类来处理对象的创建

Product:工厂方法返回一个产品,超类中定义的方法,通常使用到工厂方法的返回值

String:工厂方法可能需要参数来指定所要的产品

 

工厂方法的元素有:

A)创建者类:一个抽象的创建者类,它定义一个抽象的创建者类,它定义了一个抽象的方法,让子类实现此方法制造产品;创建者通常会包含依赖于抽象产品的代码,而这些抽象产品由子类制造,创建者不需要真的知道制造哪种具体产品;多个能够产生产品的具体类,

由于产品是在具体类实现的,所以具体类可以创建具有自己特色的产品。

B)产品类:一个抽象产品, 多个具体产品;


工厂方法模式应用场景:

1.当一个类不知道它所必须创建的对象的类的时候

2.当一个类希望由它的子类来指定它所创建的对象的时候

3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将那一个帮助子类是代理者这一信息局部化的时候

 

工厂方法相较于简单工厂模式的有点:

a)工厂方法相较于简单工厂模式,工厂方法更符合开放-封闭原则。

b)工厂方法模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码进行,想要增加功能,简单工厂是修改工厂类,而工厂方法模式修改的是客户端。

 

一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只创建一个具体产品类的实例。

以披萨店为例子,PizzaStore为披萨总店(父类), NYPizzaStore为纽约披萨分店(子类)

以下是它的UML

 技术分享

public abstract class PizzaStore {

abstract Pizza createPizza(String item);

public Pizza orderPizza(String type) {

Pizza pizza = createPizza(type);

System.out.println("--- Making a " + pizza.getName() + " ---");

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

}

工厂方法模式:披萨总店有两个方法,一个是创建对象的createPizzacreatePizza()是抽象方法,只有在子类实现具体的类型。

public class NYPizzaStore extends PizzaStore {

Pizza createPizza(String item) {

if (item.equals("cheese")) {

              return new NYStyleCheesePizza();

} else if (item.equals("veggie")) {

          return new NYStyleVeggiePizza();

} else if (item.equals("clam")) {

          return new NYStyleClamPizza();

          } else if (item.equals("pepperoni")) {

                   return new NYStylePepperoniPizza();

} else return null;

}

}

工厂方法模式:在子类中必须实现createPizza(), 因为它在PizzaStore中是抽象的

由子类全权决定实例化哪个对象。

设计模式_创建型模式——工厂方法

标签:设计模式   工厂方法   创建型模式   面向对象   

原文地址:http://blog.csdn.net/liuzhi0724/article/details/45074243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!