工厂模式(factory pattern) 详解

工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类.

包括:

创建者父类(creator), 包含创建对象的方法(代替new具体的对象, 通过参数创建不同的对象), 和一些基本的方法;

具体创建者(concrete creator), 继承创建者父类, 实现创建对象的方法, 不同参数可以创建不同的对象;

产品类父类(product), 包含产品的基本使用方法, 被创建者父类(creator)的基本方法使用;

具体产品(concrete creator), 继承产品类父类, 对特定的产品进行定制, 供具体创建者(concrete creator)选择创建;

具体方法:

1. 产品类父类(product), 包含产品的一些基本方法.

代码:

/**
 * @time 2014年5月26日
 */
package factory;  

import java.util.ArrayList;  

/**
 * @author C.L.Wang
 *
 */
public abstract class Pizza {
    String name;
    String dough; //生面团
    String sauce; //调味汁  

    ArrayList<String> toppings = new ArrayList<String>(); //装饰  

    void prepare() {
        System.out.println("Preparing " + name);
        System.out.println("Tossing dough..." + dough);
        System.out.println("Adding sauce..." + sauce);
        System.out.println("Adding toppings: ");
        for (int i=0; i<toppings.size(); ++i) {
            System.out.println(" " + toppings.get(i));
        }
    }  

    void bake() {
        System.out.println("Bake for 25 minutes at 350");
    }  

    void cut() {
        System.out.println("Cutting the pizza into diagonal slices");
    }  

    void box() {
        System.out.println("Place pizza in official PizzaStore box");
    }  

    public String getName() {
        return name;
    }
}

2. 具体产品类(concrete product), 具体产品的定制方法.

代码:

/**
 * @time 2014年5月26日
 */
package factory;  

/**
 * @author C.L.Wang
 *
 */
public class NYStyleCheesePizza extends Pizza {
    public NYStyleCheesePizza() {
        name = "NY Style Sauce and Cheese Pizza";
        dough = "Thin Crust Dough";
        sauce = "Marinara Sauce";  

        toppings.add("Grated Reggiano Cheese");
    }
}  

/**
 * @time 2014年5月26日
 */
package factory;  

/**
 * @author C.L.Wang
 *
 */
public class ChicagoStyleCheesePizza extends Pizza {
    public ChicagoStyleCheesePizza() {
        name = "Chicago Style Deep Dish Cheese Pizza";
        dough = "Extra Thick Crust Dough";
        sauce = "Plum Tomato Sauce";  

        toppings.add("Shredded Mozzarella Cheese");
    }  

    void cut() {
        System.out.println("Cutting the pizza into square slices");
    }
}

3. 创建者父类(creator), 具体的使用方法, 调用产品类父类(product)的方法, 提供根据参数创建不同具体产品类(concrete product).

代码:

/**
 * @time 2014年5月26日
 */
package factory;  

/**
 * @author C.L.Wang
 *
 */
public abstract class PizzaStore {
    public Pizza orderPizza(String item) {
        Pizza pizza;
        pizza = createPizza(item);  

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();  

        return pizza;
    }  

    abstract Pizza createPizza(String item);
}

4. 具体创建者(concrete creator), 通过参数创建不同的具体产品(concrete product).

代码:

/**
 * @time 2014年5月26日
 */
package factory;  

/**
 * @author C.L.Wang
 *
 */
public class NYPizzaStore extends PizzaStore {  

    /* (non-Javadoc)
     * @see factory.PizzaStore#createPizza(java.lang.String)
     */
    @Override
    Pizza createPizza(String item) {
        // TODO Auto-generated method stub  

        if (item.equals("cheese")) {
            return new NYStyleCheesePizza();
        } else return null;
    }  

}  

/**
 * @time 2014年5月26日
 */
package factory;  

/**
 * @author C.L.Wang
 *
 */
public class ChicagoPizzaStore extends PizzaStore {  

    /* (non-Javadoc)
     * @see factory.PizzaStore#createPizza(java.lang.String)
     */
    @Override
    Pizza createPizza(String item) {
        // TODO Auto-generated method stub  

        if (item.equals("cheese")) {
            return new ChicagoStyleCheesePizza();
        } else return null;
    }  

}

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/

5. 测试, 创建不同的具体创建者(concrete creator), 即工厂, 通过调用函数的参数, 选择不同的产品进行使用.

代码:

/**
 * @time 2014年5月26日
 */
package factory;  

/**
 * @author C.L.Wang
 *
 */
public class PizzaTestDrive {  

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();  

        Pizza pizza = nyStore.orderPizza("cheese");
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");  

        pizza = chicagoStore.orderPizza("cheese");
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
    }  

}

6. 输出:

Preparing NY Style Sauce and Cheese Pizza
Tossing dough...Thin Crust Dough
Adding sauce...Marinara Sauce
Adding toppings:
 Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a NY Style Sauce and Cheese Pizza  

Preparing Chicago Style Deep Dish Cheese Pizza
Tossing dough...Extra Thick Crust Dough
Adding sauce...Plum Tomato Sauce
Adding toppings:
 Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Joel ordered a Chicago Style Deep Dish Cheese Pizza

面向对象的设计原则:

依赖倒置原则: 要依赖抽象, 不要依赖具体类.

指导方针:

1. 变量不可以持有具体类的引用.

2. 不要让类派生自具体类.

3. 不要覆盖基类中已实现的方法.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 方法
, creator
, 基本
, 装饰模式详解
, println
创建者
factory工厂模式、海信电视工厂模式详解、ios 工厂模式详解、java 工厂模式详解、安卓工厂模式详解,以便于您获取更多的相关知识。

时间: 2024-12-13 08:21:02

工厂模式(factory pattern) 详解的相关文章

抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/detail/u012515223/7403553 具体方法: 1. 提供一个抽象工厂(abstract factory)接口(interface)类, 不同的具体工厂(concrete factory)继承此类. 代码: /** * @time 2014年5月26日 */ package factory; /** * @author C.L.W

状态模式(state pattern) 详解

状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(), 具体状态类(concrete state)继承(implement)状态类(state), 实现handle()方法; 具体方法

策略模式(Strategy Pattern) 详解

策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法, 重新设定接口的行为. 提供行为的调用的方法(如perform), 需要调用接口(interface)的固有方法(fly & quack)即可. 代码: package strategy; public abstract class Duck

装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展; 可以是抽象类(abstract class), 也可以是接口(interface); 代码: /** * @time 2014年5月23日 */ package decorator; /

java 桥模式(Bridge Pattern)详解_java

java 桥模式(Bridge Pattern) Bridge模式解耦,其实施的定义.它是一种结构模式.本模式涉及充当桥的接口.这座桥使具体的类独立的接口实施者类.  Bridge模式解耦,其实施的定义.它是一种结构模式. 本模式涉及充当桥的接口.这座桥使具体的类独立的接口实施者类. 这两种类型的类可以在不影响彼此被改变. 实例: interface Printer { public void print(int radius, int x, int y); }//from www.j a v

javascript原型模式用法实例详解_javascript技巧

本文实例讲述了javascript原型模式用法.分享给大家供大家参考.具体分析如下: 一般在了解了工厂模式和构造函数模式的弊端之后,就知道为什么需要原型模式了   原型模式i的定义:每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法.比如在构造函数模型中sayInformation()方法,如果声明两个实例就要构造两次sayInformation方法,但是声明两次是没有必要的,这就是为什么有原型模式的出现(尼玛,网上那些博客

设计模式(一)工厂模式Factory(创建型)

设计模式一 工厂模式Factory          在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题

JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码

反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton). 参考URL: http://blog.csdn.net/xiaohai798/article/details/11640427 用接口来沟通不同程序的开发进度,不必等上游程序写好代码之后,再注入后面流程的程序员.且在实现上,可以用配置文件灵活变更,而不用重编译整个项目. InterfaceTest.java: interface InterfaceTest { //基于接

javascript设计模式之对象工厂函数与构造函数详解_基础知识

下面通过文字详解加代码分析的方式给大家分享下javascript设计模式之对象工厂函数与构造函数的相关知识. 概述使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法.然而,除了这两种常用的对象创建方式,JavaScript还提供了其他方法创建对象.1).使用工厂函数创建对象我们可以编写一个函数,此函数的功能就是创建对象,可将其. 概述 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法. 然而,除了这两种常用的对象创建方式,JavaScript还提