`
frank127
  • 浏览: 10941 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

factory pattern

阅读更多
let's say you have a pizza shop. you might end up writing some code like this:

Pizza orderPizza() {
Pizza pizza = new Pizza();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;


When you need more than one type of pizza

Pizza orderPizza(String type) {
Pizza pizza;
if (type.equals("cheese")) {
 pizza = new CheesePizza();
} else if (type.equals("greek")) {
 pizza = new GreekPizza();
} else if (type.equals("peoperoni")) {
 pizza = new PepperoniPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;


Clearly, dealing with which concrete class is instantiated is really messing up our orderPizza() method and preventing it from being closed for modification


What should we do then?
Well, what we're going to do is take the creation code and move it out into another object that is only going to be concerned with creating pizzas.

We've got a name for this new object: we call it a factory.


Reworking the pizzastore class
public class PizzaStore {
 SimplePizzaFactory factory;

 public PizzaStore(SimplePizzaFactory factory) {
  this.factory=factory;
 }
 
 public Pizza orderPizza(String type) {
  Pizza pizza;
  pizza=factory.createPizza(type);
  pizza.prepare();
  pizza.bake();
  pizza.cut();
  pizza.box();
  return pizza;
 }
}

public class SimplePizzaFactory {
  public Pizza createPizza(String type) {
    Pizza pizza=null;
    
    if (type.equals("cheese")) {
      pizza=new CheesePizza();
    } else if (type.equals("pepperoni")) {
      pizza=new PepperoniPizza();
    } else if (type.equals("veggie")) {
      pizza=new VeggiePizza();
    }
    return pizza;
}
}


class diagram


Franchising the pizza store
As the franchiser, you want to ensure the quality of the franchise operations. Each franchise might want to offer different styles of pizzas(NY, Chicago) depending on where the franchise store is located and the tastes of the local pizza connoisseurs

NyPizzaFactory nyFactory=new NYPizzaFactory();
PizzaStore nyStore=new PizzaStore(nyFactory);
nyStore.order("Veggie");


So you test marketed the SimpleFactory idea, and what you found was that the franchise were using your factory to create pizzas. Rethinking the problem a bit, you see that what you'd really like to do is create a framework that ties the store and the pizza creation together, yet still allows things to remain flexible.



allowing the subclasses to decide


Let's make a PizzaStore

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 return null;
  }
}
分享到:
评论
1 楼 az12xc34 2014-12-01  

相关推荐

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...

    Abstract Factory Pattern.docx

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这种模式的主要目的是为了隔离产品对象的创建过程,使得更换产品族或者...

    The Factory Pattern(工厂模式)ppt

    工厂模式是一种常用的设计模式,它的主要目的是为了封装对象的创建过程,从而使得代码更加灵活,易于维护和扩展。在Head First设计模式中,工厂模式被用来解决对象创建时的“变化”问题,尤其是在需要根据条件动态...

    通过C#实现抽象工厂模式(Abstract Factory Pattern).rar

    在C#中实现抽象工厂模式(Abstract Factory Pattern)涉及定义一个抽象工厂接口,该接口声明用于创建抽象产品的方法。然后,为每个具体产品族实现一个具体工厂,这些工厂提供创建具体产品的实现。最后,客户端代码...

    前端大厂最新面试题-Factory Pattern.docx

    Factory Pattern(工厂模式) 在软件开发中,工厂模式(Factory Pattern)是一种常用的设计模式,用于创建对象的实例,而不暴露创建对象的具体逻辑。工厂模式的主要思想是将对象的创建过程封装起来,使得调用方不...

    通过python实现抽象工厂模式(Abstract Factory Pattern).rar

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖对象的接口。这个模式使得客户端代码与具体产品的实现解耦,从而提高了系统的灵活性和...

    Interfaces + Factory pattern = Decoupled architecture

    Interfaces + Factory pattern = Decoupled architecture

    Simple Factory Pattern.rar【GoF的简单工厂模式(C#源码)】

    简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常它根据自变量的不同返回不同的类的实例。...我已经用C#的源码编程了:请下载Simple Factory Pattern.rar

    抽象工厂模式(Abstract Factory Pattern)

    ### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...

    设计模式 之 “抽象工厂模式[Abstract Factory Pattern]”

    **抽象工厂模式(Abstract Factory Pattern)**是一种创建型设计模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式是当一个系统需要根据不同的平台或者环境来创建一组相关或相互依赖的对象时,...

    通过java实现抽象工厂模式(Abstract Factory Pattern).rar

    在Java中,抽象工厂模式(Abstract Factory Pattern)同样是一种创建型设计模式,它允许在不指定具体类的情况下创建一系列相关或相互依赖的对象。压缩包文件代码是一个简单的Java实现示例,展示了如何使用抽象工厂...

    创建型模式--工厂模式(Factory Pattern)示范代码

    java 创建型模式--工厂模式(Factory Pattern)示范代码demo,关于工厂模式可以查看我的博客 http://blog.csdn.net/u012930316/article/details/54599580

    Head First 设计模式 (四) 工厂模式(factory pattern) C++实现

    1. **抽象工厂(Abstract Factory)**:这是工厂模式的核心接口,定义了创建产品对象的公共接口。在C++中,通常用抽象类或者纯虚函数接口来表示。 2. **具体工厂(Concrete Factory)**:实现了抽象工厂接口,负责...

    C++factory pattern

    C++工厂模式是一种设计模式,属于创建型模式,它提供了一种封装对象创建的方式,使得客户端无需知道具体的创建逻辑,而是通过一个公共的接口来获取所需的对象。在给定的例子中,我们可以通过以下文件了解其具体实现...

    [创建型模式] 设计模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):定义一个创建对象的接口,但不指定具体的产品实现,而是由具体的工厂类来实现。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品对象。 3. 抽象产品...

    A-classic-factory-pattern-example.rar_factory

    这个"A-classic-factory-pattern-example.rar_factory"压缩包中包含的"一个工厂模式的简单但典型的例子"是为了帮助初学者理解和应用工厂模式而设计的。下面我们将详细探讨工厂模式的核心概念、工作原理以及其在实际...

    factory&singlton pattern

    标题中的“factory&singleton pattern”指的是工厂模式和单例模式,这是两种常见的设计模式,在软件工程中被广泛使用,特别是对于对象的创建和管理。设计模式是解决常见问题的成熟方案,它们为软件开发提供了良好的...

    Calculator:使用Command Factory Pattern的Java控制台应用程序

    【Calculator:使用Command Factory Pattern的Java控制台应用程序】 在编程领域,设计模式是解决常见问题的最佳实践和模板。"命令工厂模式"(Command Factory Pattern)是其中一种行为设计模式,它将请求封装为一个...

    Factory_Method&&Simple_Factory

    工厂方法模式(Factory Method Pattern)是设计模式中的创建型模式之一,主要解决对象创建过程中的复杂性问题。在软件工程中,当一个类不知道它所必须创建的对象的类的时候,它就不会实例化对象,而是使用一个工厂...

    DesignPattern

    在这个名为“DesignPattern”的压缩包中,包含了一个关于简单工厂模式(Simple Factory Pattern)的示例,名为“DesignPattern_SimpleFactoryPattern”。 简单工厂模式的核心思想是将对象的创建过程封装到一个单独...

Global site tag (gtag.js) - Google Analytics