披萨

创建型模式之建造者模式

人盡茶涼 提交于 2020-03-22 14:36:56
3 月,跳不动了?>>> 1 概述 前面我们说了 工厂模式 和 抽象工厂模式 ,下面来说说 建造者模式 。 建造者模式 也是一种极为常见的 创建型模式 ,前面提到的两类 工厂 模式隐藏了类的属性与构造细节,而 建造者模式 通过 Builder 类,适当地暴露了类的属性,使得类的创建更具有灵活性和可读性。 2 建造者模式 当一个类的构造函数包含很多参数,或者参数之间有很多种组合(如肯德基的套餐),调用构造函数来创建类将会变得不方便,可读性也很差。对于多种组合的情况, 工厂模式 也将变得不适用。 在这种情况下, 建造者模式 提供了一种思路,通过将类的创建委托给 建造器 (Builder),将类的创建与表示分离,大大地简化了类创建的复杂度。 3 案例 考虑做一个 Pizza ,为方便起见,让它只包含尺寸,底,馅以及是否加芝士四个属性。看看如何用 建造者模式 来创建: public class Test { public static void main(String[] args) { Pizza.Builder pizzaBuilder = new Pizza.Builder(); Pizza pizza = pizzaBuilder.size(6) .crustType(Pizza.CrustType.THIN) .topping("Durian") .build(); pizza

设计模式之工厂模式(2)工厂方法模式

久未见 提交于 2020-03-11 17:43:54
学习设计模式的日常Demo 工厂方法模式 工厂方法模式介绍 代码实现: abstract class OrderPizza { // 定义一个抽象方法,让各个工厂自己实现 abstract Pizza createPizza ( String orderType ) ; public void buy ( ) { String orderType = "" ; // 用户输入的 Pizza pizza = null ; do { orderType = getType ( ) ; pizza = createPizza ( orderType ) ; // 抽象方法,由工厂子类实现 //输出pizza if ( pizza != null ) { // 订购成功 pizza . prepare ( ) ; pizza . bake ( ) ; pizza . cut ( ) ; pizza . box ( ) ; } else { System . out . println ( "订购披萨失败" ) ; break ; } } while ( true ) ; } // 写一个方法,可以获取客户输入的披萨种类 private String getType ( ) { try { BufferedReader strin = new BufferedReader ( new

设计模式:抽象工厂模式(Abstract Factory)

我怕爱的太早我们不能终老 提交于 2020-01-26 05:27:04
在设计原则中有这样一句话“我们应该针对接口编程,而不是正对实现编程”。但是我们还是在一直使用new关键字来创建一个对象,这不就是在针对实现编程么? 针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。入股代码是针对接口而写,那么可以通过多态,它可以与任何新类实现该接口。但是,当代码使用一大堆的具体类时,等于是自找麻烦,因为一旦加入新的具体类,就必须要改变代码。在这里我们希望能够调用一个简单的方法,我传递一个参数过去,就可以返回给我一个相应的具体对象,这个时候我们就可以使用简单工厂模式。 一、基本定义 简单工厂模式又称之为静态工厂方法,属于创建型模式。在简单工厂模式中,可以根据传递的参数不同,返回不同类的实例。简单工厂模式定义了一个类,这个类专门用于创建其他类的实例,这些被创建的类都有一个共同的父类。 二、模式结构 模式结构图如下: 模式分析: Factory:工厂角色。专门用于创建实例类的工厂,提供一个方法,该方法根据传递的参数不同返回不同类的具体实例。 Product:抽象产品角色。为所有产品的父类。 ConcreteProduct:具体的产品角色。 简单工厂模式将对象的创建和对象本身业务处理分离了,可以降低系统的耦合度,使得两者修改起来都相对容易些。当以后实现改变时,只需要修改工厂类即可。 三、简单工厂模式实现 模式场景:在一个披萨店中,要根据不同客户的口味,生产不同的披萨

工厂模式

♀尐吖头ヾ 提交于 2020-01-17 00:16:01
概述 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 实例 例举披萨店的例子,一个披萨店卖三种披萨,奶酪披萨、希腊披萨,胡椒披萨,他们分别继承自pizza类。 pizza类 public abstract class Pizza { private String name;//名字 //准备原材料,不同的披萨不一样,因此,我们做成抽象方法 public abstract void prepare(); public void bake(){ System.out.println(name+"baking"); } public void cut(){ System.out.println(name+"cutting"); } //打包 public void box(){ System.out.println(name+"boxing"); } public void setName(String name) { this.name = name; } } 奶酪披萨类 继承自Pizza类实现其prepare() 方法,胡椒披萨、希腊披萨同理。 public class CheesePizza extends Pizza {

python import函数使用

前提是你 提交于 2020-01-11 01:15:19
import函数调用整个模块 例子: 首先建一个python文件 pizza.py def make_pizza ( size , * toppings ) : print ( '\nmaking a' + str ( size ) + '-inch pizza with the following topping' ) for topping in toppings : print ( '-' + topping ) 在 同目录下另一个python中调用pizza文件中的函数 make_pizza.py import pizza pizza . make_pizza ( 16 , 'pepperoni' ) pizza . make_pizza ( 12 , 'mushrooms' , 'green peppers' , 'extra cheese' ) 此时文件make_pizza.py可以访问pizza.py文件中的函数。 导入另一个文件中特定的函数 例子: 首先建一个python文件 pizza.py def make_pizza ( size , * toppings ) : print ( '\nmaking a' + str ( size ) + '-inch pizza with the following topping' ) for topping in

设计模式@第6章:工厂模式

痴心易碎 提交于 2020-01-10 22:51:13
第6章:工厂模式 一、简单工厂模式 (一)看一个具体的需求 看一个披萨的项目:要便于披萨种类的扩展,要便于维护 披萨的种类很多(比如 GreekPizz、CheesePizz 等) 披萨的制作步骤有: prepare,bake, cut, box 完成披萨店订购功能。 (二)使用传统的方式来完成 思路分析(类图) 2) 看老师代码的演示 public abstract class Pizza{ protect String name; // 因为不同的 Pizza 准备方法不同,因此做成抽象方法 public abstract void perpard(); public void bake(){ // XXXXX } public void cut(){ // XXXXX } public void box(){ // XXXXX } } //------------------------------------------------------- // 然后具体的 Pizza 实体继承 Pizza public void CheessPizza extends Pizza(){ //实现 prepare 方法 } //------------------------------------------------------- public void GreekPizza

设计模式之工厂模式

拜拜、爱过 提交于 2019-12-28 15:42:40
定义 定义一个创建对象的接口,但由子类决定要实例的类是哪一个。工厂方法让类把实例推迟到子类。 设计原则 要依赖抽象,不要依赖具体的类:不能让高层组件依赖于底层组件,并且两者都应该依赖于抽象。 指导方针 变量不可以持有具体类的引用:如果使用new,就会持有具体类的引用。可以用工厂来避开这样的做法。 不要让类派生自具体类:如果派生自具体类,你就会依赖具体类。派生自一个抽象。 不要覆盖基类中已实现的方法:如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象。基类中所有实现的方法,应该由所有子类共享。 抽象工厂模式 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定的具体类。 第一次设计(识别变化) 假设我们有一个披萨店,我们需要写代码来制造一些不同类型的披萨。 下面来看看我们最开始的设计: 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("pepperoni")) { pizza = new PepperoniPizza(); } else {

设计模式:工厂

妖精的绣舞 提交于 2019-12-26 17:10:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 模拟不同披萨店制作不同口味的披萨的情景。 首先定义main方法,它需要各种各样的披萨。 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 + "\n"); pizza = chicagoStore.orderPizza("cheese"); System.out.println("Joel ordered a " + pizza + "\n"); pizza = nyStore.orderPizza("clam"); System.out.println("Ethan ordered a " + pizza + "\n"); pizza = chicagoStore.orderPizza("clam"); System.out.println("Joel

工厂方法模式

筅森魡賤 提交于 2019-12-04 10:22:00
披萨项目需求 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza或者是伦敦的奶酪pizza、伦敦的胡椒pizza。 按照简单工厂模式,可以创建不同的简单工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好。 下面我们来看一下,如何使用工厂方法模式实现需求。 工厂方法模式 工厂方法模式介绍: 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。 工厂方法模式将对象的实例化推迟到子类。 1、Pizza类 //将Pizza 类做成抽象 public abstract class Pizza { protected String name; //名字 //准备原材料, 不同的披萨不一样,因此,我们做成抽象方法 public abstract void prepare(); public void bake() { System.out.println(name + " baking;"); } public void cut() { System.out.println(name + "

简单工厂模式

◇◆丶佛笑我妖孽 提交于 2019-12-04 07:51:30
披萨项目需求 萨的项目:要便于披萨种类的扩展,要便于维护。 1、披萨的种类很多(比如GreekPizz、CheesePizz等); 2、披萨的制作有prepare,bake, cut, box; 3、完成披萨店订购功能。 传统方式 1、我们将Pizza类相同的方法实现,将不同的方法做成抽象方法,由具体的子类去实现。 //将Pizza 类做成抽象 public abstract class Pizza { protected String name; //名字 //准备原材料, 不同的披萨不一样,因此,我们做成抽象方法 public abstract void prepare(); public void bake() { System.out.println(name + " baking;"); } public void cut() { System.out.println(name + " cutting;"); } //打包 public void box() { System.out.println(name + " boxing;"); } public void setName(String name) { this.name = name; } } 2、有两个子类奶酪披萨和希腊披萨。 public class CheesePizza extends Pizza {