工厂方法模式

英文名

Factory Method Pattern

定义

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

原则

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

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

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

理解

1.抽象接口类中定义了一个抽象方法,该方法被接口类中的另一个方法直接调用。

2.抽象方法交由子类去实现,子类的实现中会产生不同的对象。

代码

抽象接口类:工厂方法定义类

public abstract class PizzaStore {public Pizza orderPizza(String type){Pizza pizza;pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}protected abstract Pizza createPizza(String type);}

子类:产生具体的产品

public class NYStylePizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {if (type.equals("cheese")) {return new NYStyleCheesePizza();} else if (type.equals("veggie")) {return new NYStyleCheesePizza();} else if (type.equals("clam")) {return new NYStyleClamPizza();} else if (type.equals("pepperoni")) {return new NYStylePepperoniPizza();} elsereturn null;}}
public class ChicagoStylePizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {if (type.equals("cheese")) {return new ChicagoStyleCheesePizza();} else if (type.equals("veggie")) {return new ChicagoStyleVeggiePizza();} else if (type.equals("clam")) {return new ChicagoStyleClamPizza();} else if (type.equals("pepperoni")) {return new ChicagoStylePepperoniPizza();} elsereturn null;}}

商品抽象类

public abstract class Pizza {String name;String dough;String sauce;ArrayList toppings = new ArrayList();public void prepare(){System.out.println("Preparing " + name);System.out.println("Tossing dough");System.out.println("Adding toppings");for(int i=0;i<toppings.size();i++){System.out.println("  " + toppings.get(i));}}public void bake(){System.out.println("Bake for 25 minutes at 350");}public void cut(){System.out.println("Cutting the pizza into diagonal slices");}public void box(){System.out.println("Place pizza in official PizzaStore box");}public String getName(){return name;}
}

商品具体类

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");}public void cut(){System.out.println("Cutting the pizza into square slices");}}
public class ChicagoStyleClamPizza extends Pizza {}
public class ChicagoStylePepperoniPizza extends Pizza {}
public class ChicagoStyleVeggiePizza extends Pizza {}
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");}}
public class NYStyleClamPizza extends Pizza {}
public class NYStylePepperoniPizza extends Pizza {}
public class NYStyleVeggiePizza extends Pizza {}

测试程序

public class PizzaTestDrive {public static void main(String[] args) {PizzaStore nyStore = new NYStylePizzaStore();PizzaStore chicagoStore = new ChicagoStylePizzaStore();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");}}

输出结果

Preparing NY Style sauce and Cheese Pizza
Tossing dough
Adding toppingsGrated 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 PizzaPreparing Chicago Style Deep Dish Cheese Pizza
Tossing dough
Adding toppingsShredded 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. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  2. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  3. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  4. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  5. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  6. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

  7. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

  8. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  9. C#设计模式--工厂方法模式

    0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...

最新文章

  1. 优质中文NLP资源集合,做项目一定用得到!
  2. 独家 | 手把手教你运用深度学习构建视频人脸识别模型(Python实现)
  3. [导入]3.5 [ Enterprise Library ]注入模型设计
  4. fieldset在ie8下的margin\padding bug规避
  5. 使用libcurl以Post方式向HTTP服务器提交数据
  6. matlab对图像进行傅里叶变换_数字图像处理(一)—— 傅里叶变换
  7. kinect内参数的标定
  8. CSS3渐变——gradient
  9. 【神器】这三款网络抓包工具在手,同事想甩锅都难!
  10. 稀疏编码的经典解法——ISTA算法的推导
  11. 期刊论文发表有哪些方法
  12. led伏安特性实验误差分析_为什么非线性电阻元件伏安特性曲线的误差分析?
  13. 沪深300指数的跟踪基金排名
  14. [BZOJ4340][BJOI2015]隐身术(后缀数组)
  15. 中国共享经济行业前瞻及投资战略规划评估分析报告2022-2028年版
  16. 【成本收集器】目标成本与实际成本差异分析
  17. 我的世界java版怎么用结构方块_我的世界结构方块指令(获取结构方块和 使用方法)...
  18. yarn 安装 报错:“info There appears to be trouble with your network connectio“ 解决方案
  19. 秒懂Gradle之从完全懵逼到似懂非懂
  20. iNode Mac版本下载(亲测兼容M1 Pro)

热门文章

  1. 属于python语言中合法的二进制整数是_以下选项属于 Python 整数类型的是( )
  2. 关于AsyncHttpClient的cz.msebera.android.httpclient.Header
  3. 【资源分享】Undertale(传说之下)简体中文精品整合包
  4. MATLAB算法实战应用案例精讲-【人工智能】语义分割(补充篇)(附matlab代码实现)
  5. 网易im 会话列表不显示的问题
  6. 如何查看自己电脑的ip地址
  7. kubernetes节点减容与扩容
  8. iOS10全新方法实现推送+deviceToken无法获取或无效的解决
  9. Prescan(六):prescan设置不停绕圈的障碍车
  10. Open Policy Agent(OPA) rego使用