Java设计模式(五) 工厂模式
1,定义抽象产品类
- package com.pattern.factory;
- import java.util.ArrayList;
- public abstract class Pizza {
- String name;
- String dough;
- String sauce;
- ArrayList toppings = new ArrayList();
- void prepare(){
- System.out.println("Prepareing "+name);
- System.out.println("Tossing dough...");
- System.out.println("Adding 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,具体产品类
- package com.pattern.factory;
- 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");
- }
- }
- package com.pattern.factory;
- 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");
- }
- }
3,定义抽象工厂类
- package com.pattern.factory;
- 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) ;
- }
4,定义具体工厂类
- package com.pattern.factory;
- import com.pattern.factory.bean.ChicagoStyleClamPizza;
- import com.pattern.factory.bean.ChicagoStylePepperoniPizza;
- import com.pattern.factory.bean.ChicagoStyleVeggiePizza;
- public class ChicagoPizzaStore extends PizzaStore {
- /**
- * @see com.pattern.factory.PizzaStore#createPizza(java.lang.String)
- */
- @Override
- protected 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();
- } else {
- return null;
- }
- }
- }
- package com.pattern.factory;
- import com.pattern.factory.bean.NYStyleClamPizza;
- import com.pattern.factory.bean.NYStylePepperoniPizza;
- import com.pattern.factory.bean.NYStyleVeggiePizza;
- public class NYPizzaStore extends PizzaStore {
- /**
- * @see com.pattern.factory.PizzaStore#createPizza(java.lang.String)
- */
- @Override
- protected Pizza createPizza(String type) {
- if(type.equals("cheese")){
- return new NYStyleCheesePizza();
- } else if(type.equals("veggie")){
- return new NYStyleVeggiePizza();
- } else if(type.equals("clam")){
- return new NYStyleClamPizza();
- } else if(type.equals("pepperoni")){
- return new NYStylePepperoniPizza();
- } else {
- return null;
- }
- }
- }
5,测试类
- package com.pattern.factory;
- public class PizzaTestDrive {
- public static void main(String[] args) {
- 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 order a "+ pizza.getName()+"\n");
- }
- }
测试结果:
Prepareing NY Style Sauce and Cheese Pizza
Tossing dough...
Adding 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
Prepareing Chicago Style Deep Dish Cheese Pizza
Tossing dough...
Adding 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 order a Chicago Style Deep Dish Cheese Pizza
类图如下所示:
Java设计模式(五) 工厂模式的更多相关文章
- java设计模式2————工厂模式
1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- java 设计模式之工厂模式与反射的结合
工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ...
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- Java 设计模式之工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
随机推荐
- 【一周读书】All life is problem solving
书籍:<开放的智力> 采铜是我在知乎关注最早的大V之一,那时我脑里有一大堆疑惑和问题,是他的答案帮助我理清了思绪.我从他身上学习到对书籍的爱好,对思维方法的关注,对智慧的向往.读这本小集子 ...
- 第28章 行为型模式大PK
27.1 策略模式 VS 命令模式 27.1.1 策略模式实现压缩算法 //行为型模式大PK——策略模式和命令模式 //实例:用策略模式实现压缩算法 #include <iostream> ...
- AC日记——密码翻译 openjudge 1.7 09
09:密码翻译 总时间限制: 1000ms 内存限制: 65536kB 描述 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍 ...
- CSS中的常用属性
一 CSS文字属性:color : #999999; /*文字颜色*/font-family : 宋体,sans-serif; /*文字字体*/font-size : 9pt; /*文字大小*/fon ...
- file文件的操作
<?php //echo readfile('D:\\123.txt');//读取文件内容第一种方式,返回字符串,但是带有长度 echo '<br>'; //var_dump(fil ...
- 转:[版本控管]TortoiseSVN 使用,抓出兇手,使用 Blame 查看每一行最後修改的人是誰
类似的官方的使用手段有: https://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-dug-blame.html from: http:/ ...
- webpack.optimize.CommonsChunkPlugin插件的使用
方式一,传入字符串参数 new webpack.optimize.CommonsChunkPlugin('common.js'), // 默认会把所有入口节点的公共代码提取出来,生成一个common. ...
- [转]PHP 下使用 ZeroMQ 和 protobuf
FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html 前言 这个记录总的来说分两部分: 搭建环境. 简单使用教程. 搭建环境 ...
- java中wait/notify机制
通常,多线程之间需要协调工作.例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程 downloadThread将该图片下载完毕.如果图片还没有下载完,d ...
- Linux 网络编程详解六(多进程服务器僵尸进程解决方案)
小结:在点对点p2p程序中,服务器端子程序退出,子进程会主动发送信号,关闭父进程,但是这种模式导致服务器只能支持一个客户端连接,本章节中使用新的框架,子进程退出,不主动发送信号关闭父进程,而是父进程安 ...