设计模式 - 工厂模式

news/2024/11/24 11:33:47/

简单工厂模式

基本介绍:

  • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族 中最简单实用的模式
  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行 为
  • 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会 使用到工厂模式

定义抽象类:

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;}
}

定义 Pizza 继承类:

public class CheesePizza extends Pizza{@Overridepublic void prepare() {setName("奶酪pizza");System.out.println(name + " preparing;");}
}public class GreekPizza extends Pizza {@Overridepublic void prepare() {setName("GreekPizza");System.out.println(name + " preparing;");}
}public class PepperPizza extends Pizza {@Overridepublic void prepare() {setName("PepperPizza");System.out.println(name + " preparing;");}
}

定义 工厂类:

public class SimplePizzaFactory {public Pizza createPizza(String type){System.out.println(" 使用简单工厂模式");Pizza pizza = null;if (type.equals("cheese")) {pizza = new CheesePizza();}else if(type.equals("greek")){pizza = new GreekPizza();} else if (type.equals("pepper")) {pizza = new PepperPizza();}return pizza;}
}

使用:

public class OrderPizza {SimplePizzaFactory simpleFactory;Pizza pizza;String orderType;public OrderPizza(SimplePizzaFactory simpleFactory, String orderType) {this.orderType = orderType;this.setFactory(simpleFactory);}public void setFactory(SimplePizzaFactory simpleFactory) {this.simpleFactory = simpleFactory;pizza = simpleFactory.createPizza(orderType);pizza.prepare();pizza.bake();pizza.cut();pizza.box();}public static void main(String[] args) {SimplePizzaFactory simpleFactory = new SimplePizzaFactory();OrderPizza orderPizza = new OrderPizza(simpleFactory, "greek");}
}

工厂方法模式

基本介绍:

定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方 法模式将对象的实例化推迟到子类

定义抽象方法,让各个工厂子类自己实现:

public abstract class OrderPizza {Pizza pizza;public OrderPizza(String orderType) {pizza = createPizza(orderType);//抽象方法,由工厂子类完成//输出 pizza 制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}public OrderPizza() {}//定义一个抽象方法,createPizza,让各个工厂子类自己实现abstract Pizza createPizza(String orderlype);public static void main(String[] args) {OrderPizza pizza = new BJOrderPizza("cheese");}
}

子类实现一:

public class BJCheesePizza extends Pizza {@Overridepublic void prepare() {setName("BJ奶酪pizza");System.out.println(name + " preparing;");}
}public class BJPepperPizza extends Pizza {@Overridepublic void prepare() {setName("BJPepperPizza");System.out.println(name + " preparing;");}
}public class BJOrderPizza extends OrderPizza{public BJOrderPizza(String orderType) {super(orderType);}@OverridePizza createPizza(String orderType) {Pizza pizza = null;if(orderType.equals("cheese")) {pizza = new BJCheesePizza();} else if(orderType.equals("pepper")) {pizza = new BJPepperPizza();}return pizza;}
}

子类实现二:

public class SHCheesePizza extends Pizza {@Overridepublic void prepare() {setName("SH奶酪pizza");System.out.println(name + " preparing;");}
}public class SHPepperPizza extends Pizza {@Overridepublic void prepare() {setName("SHPepperPizza");System.out.println(name + " preparing;");}
}public class SHOrderPizza extends OrderPizza{public SHOrderPizza(String orderType) {super(orderType);}@OverridePizza createPizza(String orderType) {Pizza pizza = null;if(orderType.equals("cheese")) {pizza = new SHCheesePizza();} else if(orderType.equals("pepper")) {pizza = new SHPepperPizza();}return pizza;}
}

抽象工厂模式

基本介绍:

  • 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需 指明具体的类
  • 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进
  • 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以 根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇, 更利于代码的维护和扩展

抽象工厂的抽象层:

/*** 声明AbsFactory接口*/
public interface AbsFactory {//让不同的工厂类来实现createPizza方法public Pizza createPizza(String type);
}

具体实现一:

public class BJCheesePizza extends Pizza {@Overridepublic void prepare() {setName("BJ奶酪pizza");System.out.println(name + " preparing;");}
}public class BJPepperPizza extends Pizza {@Overridepublic void prepare() {setName("BJPepperPizza");System.out.println(name + " preparing;");}
}public class BJFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {Pizza pizza = null;if(orderType.equals("cheese")) {pizza = new BJCheesePizza();} else if(orderType.equals("pepper")) {pizza = new BJPepperPizza();}return pizza;}
}

具体实现二:

public class SHCheesePizza extends Pizza {@Overridepublic void prepare() {setName("SH奶酪pizza");System.out.println(name + " preparing;");}
}public class SHPepperPizza extends Pizza {@Overridepublic void prepare() {setName("SHPepperPizza");System.out.println(name + " preparing;");}
}public class SHFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {Pizza pizza = null;if(orderType.equals("cheese")) {pizza = new SHCheesePizza();} else if(orderType.equals("pepper")) {pizza = new SHPepperPizza();}return pizza;}
}

执行类:

public class OrderPizza {AbsFactory factory;String orderType;// 构造器public OrderPizza(AbsFactory factory, String orderType) {this.orderType = orderType;setFactory(factory);}public void setFactory(AbsFactory factory){Pizza pizza = null;this.factory = factory;pizza = factory.createPizza(orderType);//输出 pizza 制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}public static void main(String[] args) {BJFactory factory = new BJFactory();OrderPizza orderPizza = new OrderPizza(factory, "greek");}
}


http://www.ppmy.cn/news/78232.html

相关文章

数据结构(C语言):有序顺序表的设计及相关操作函数

一、题目 有序顺序表的设计 实验要求: 有序顺序表的操作,包括初始化,求数据元素个数,插入,删除和取数据元素。放在头文件中(建议尝试用动态数组实现有序顺序表);注意有序顺序表的…

【nginx】同一接口有时返回500(client_body_temp)

问题描述: 同一个接口,有能正常访问并返回的,有的访问未到服务器直接返回500。 查看nginx日志(error.log),发现open() "/nginx/client_body_temp/0000476534" failed (13: Permission denied)报…

使用go语言构建区块链 Part4.事务1

英文源地址 简介 事务是比特币的核心, 区块链的唯一目的是以安全可靠的方式存储交易, 因此在交易创建后没有人可以修改. 今天我们开始实现事务, 但由于这是一个相当大的主题, 我将它分成两部分: 在这一部分中, 我们将实现事务的通用机制, 在第二部分中, 我们将研究细节. 此外…

图表控件LightningChart JS v.4.0全新发布!引入DataGrid 组件、新的颜色主题

LightningChart JS是性能最高的JavaScript图表库,专注于实时数据可视化。是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画。…

基于微信小程序的医院挂号预约系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

VUE2.0学习笔记

v-on:click 可以简写为 clickvm.$data 输出data对象vm.$el 输出对象的htmlvm.$destroy() 销毁这个实例this. e l , t h i s 指向组件的实例。 el ,this指向组件的实例。 el,this指向组件的实例。el指向当前组件的DOM元素。8个生命周期, create、mount、destroy、upd…

(九)深入理解蓝牙BLE之“安全管理Part2(SMP legacy pairing)”

目录 前言: 配对: Phase 1:Pairing Feature Exchange Phase 2:Short Term Key (STK) Generation Phase 3:Transport Specific Key Distri

视频课|csdn付费资源变现第一讲,为什么csdn项目值得长期去做?

csdn项目再开始做的时候,想着没有多少人,就随便问了下,发现就来了50来位直接报名。 于是直接开整,刚开始写文,升级流程还比较磕巴,主要是我个人的一些经验值,缺少更多的测验。 随着大家不断地去…