首页 > 其他分享 >设计模式(4)--工厂模式

设计模式(4)--工厂模式

时间:2023-01-06 10:35:15浏览次数:35  
标签:String -- gongchangmoshi 工厂 pizza import 设计模式 public Pizza


  • 通过Pizza项目引出简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式
  • 关键点

  • 披萨项目:要方便披萨 品种的扩展、要便于维护、要能运行时扩展
  • 披萨族设计:
  • 定义一个Pizza的抽象类,定义四种方法prepare()抽象方法因为每个都不一样,但是bake(), cut(), box()都会一样。
  • 按照这种设计方式,会更改类的内容所以就会为被了对扩展的开发,遇到问题分成变化的部分和不变化的部分
  • 披萨工厂设计:if…else if …else工厂模式解决的时对象实例化的问题,将类的实例化放到某个地方进行管理

简单工厂模式:

  • 定义一个创建对象的类,由这个类封装实例化对象的行为。主要解决大量实例化某些某类的情况,需要将大量类的实例化放到一个合适的地方。简单工厂这个类就是进行大量类的实现的类。把变化的部分抽取出来,将维护和扩展分割开来降低了耦合度。
package gongchangmoshi;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-16
* Time: 12:19
*/
public abstract class Pizza {
public String getName() {
return name;
}


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");
}
}
package gongchangmoshi;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-16
* Time: 12:28
*/
public class SimplePizzaFactory {
public Pizza createPizza(String orderType) {
//将变化的部分放到这里
Pizza pizza = null;
if (orderType.equals("greek")) {
pizza = new GreekPizza();
}
return pizza;
}
}
package gongchangmoshi;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-16
* Time: 12:31
*/
public class OrderPizza {
SimplePizzaFactory simplePizzaFactory;
public OrderPizza(SimplePizzaFactory simplePizzaFactory){
setSimplePizzaFactory(simplePizzaFactory)
}
public void setSimplePizzaFactory(SimplePizzaFactory simplePizzaFactory){
Pizza pizza = null;
String orderType;
this.simplePizzaFactory = simplePizzaFactory;
do{
orderType = gettype();
pizza = simplePizzaFactory.createPizza(orderType);
if(pizza!=null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}while(true);
}
private String gettype() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("input pizza type:");
String str = strin.readLine();


return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}

工厂模式:

  • 将披萨项目里的披萨对象实例化功能抽象成抽象方法,在不同加盟点具体实现功能。
  • 披萨加盟店的困惑:
  • 如果使用简单工厂来做就会发现使用简单工厂就会在每个地方创建一个简单工厂,不利于代码维护。
package gongchangmoshi.gongchangmoshi;


import gongchangmoshi.Pizza;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 19:26
*/
public abstract class OrderPizza {
public OrderPizza(){
Pizza pizza = null;
String ordertype;
do{
ordertype = getType();
pizza = createPizza(ordertype);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);


}
abstract Pizza createPizza(String orderType);
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("input pizza type:");
String str = strin.readLine();


return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
package gongchangmoshi.gongchangmoshi;

import gongchangmoshi.GreekPizza;
import gongchangmoshi.Pizza;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 19:32
*/
public class LDOrderPizza extends OrderPizza {


@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("gw")){
pizza = new GreekPizza();
}
return pizza;
}
}

抽象工厂模式:

  • 定义了一个接口 用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
  • 将工厂的公用部分抽象成接口,封装不同的方法,实现pizza族实现不变的功能,在订单中传入的是抽象的工厂,具体实现的时候可以进行具体化更改,然后实现即可
package gongchangmoshi.chouxianggongchang;


import gongchangmoshi.Pizza;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 19:43
*/
public interface AbsFactory {
public Pizza createPizza(String orderType);
}
package gongchangmoshi.chouxianggongchang;


import gongchangmoshi.GreekPizza;
import gongchangmoshi.Pizza;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 19:46
*/
public class LDOrderPizza implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza = new GreekPizza();
System.out.println("制造纽约风味的pizza");
return pizza;
}
}
package gongchangmoshi.chouxianggongchang;


import com.sun.org.apache.xpath.internal.operations.Or;
import gongchangmoshi.Pizza;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 19:44
*/
public class OrderPizza {
AbsFactory absFactory;
public OrderPizza(AbsFactory absFactory){


}
public void setFactory(AbsFactory absFactory){
Pizza pizza = null;
String orderType;
this.absFactory = absFactory;
do{
orderType = getType();
pizza = absFactory.createPizza(orderType);
if(pizza!=null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}while (true);
}
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("input pizza type:");
String str = strin.readLine();


return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
package gongchangmoshi.chouxianggongchang;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 19:49
*/
public class PizzaStore {
public static void main(String[] args) {
OrderPizza orderPizza;
orderPizza = new OrderPizza(new LDOrderPizza());
}
}


标签:String,--,gongchangmoshi,工厂,pizza,import,设计模式,public,Pizza
From: https://blog.51cto.com/u_13987312/5992404

相关文章

  • SiteFactory编辑器支持Word图文一键上传
    ​ 自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了。一般情况下我们将Word内容粘贴到Web编辑......
  • 设计模式(1)--设计原则
    学习目标:*掌握GOF核心设计模式*掌握重构技法改善设计*掌握面向对象设计原则*理解松耦合设计思想以后会把之前学的设计模式都放上来设计模式:设计模式是一套被反复利用......
  • Canvas与图层(二)画布与图层
    图层(Layer):每次调用canvas.drawXXX系列函数,都会生成一个透明图层来绘制这个图形画布(Bitmap):每块画布都是一个Bitmap,所有的图像都是画在这个Bitmap上的,画布有两种:*一种是Vi......
  • VUE中的键盘事件(按键别名)
    1.vue中常用的按键别名:回车=>enter删除=>delete(捕获“删除”和“退格”键)退出=>esc空格=>space换行=>tab  //不适合用keyup事件,tab会切走当前选中的......
  • 设计模式(2)--策略模式
    引入:模拟鸭子项目:从面向对象的角度设计这个项目,共同有一个gaga()叫,一个swim()方法,但是有一个display()方法不相同,所以前两个相同就在父类中实现,剩下一个在父类中是抽象方法......
  • RFID条形码标签软件丨CODESOFT功能简介
    RFID和条形码标签软件,铺就企业成功的基石 1、先进的条形码标签创建与集成2、智能的用户界面3、稳健可靠的数据库连接4、100多种条形码符号体系5、集标签和文......
  • 物联网APP开发简介
    物联网物联网(IoTInternetofThings,缩写IoT),核心的基础仍然是互联网,任何物品与物品之间的信息交换和通信,物联网通过射频识别(RFID),红外感应器,全球定位系统,激光扫描器等,把任何......
  • linux安装PHP5.6.30
    原文链接:https://blog.csdn.net/m0_55116875/article/details/121981413前言:当搭建PHP项目时,如果在搭建环境时缺少freetype,会导致访问nginx页面时,登录界面验证码无法成功......
  • 关于异或-异或运算及其应用
    概念异或,是一个数学运算符,英文为exclusiveOR,缩写为xor,应用于逻辑运算异或的数学符号为“⊕”,计算机符号为“xor”  如果a、b两个值不相同,则异或结果为1......
  • 设计模式(7)--单例模式
    单例模式的意义:用到的类的对象只能有一个(线程池,缓存,打印机等硬件设备)。如果多个实例会有造成冲突、结果不一致等问题可以用静态变量来指代这个对象来实现协商一个全局变量实......