Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)

文章目录

  • 五.工厂模式
    • 5.1 概述
    • 5.2简单工厂模式
      • 5.2.1 概述
      • 5.2.2 结构
      • 5.2.3 实现
      • 5.2.4 优缺点
      • 5.2.5 扩展—静态工厂
    • 5.3 工厂方法模式
      • 5.3.1概述
      • 5.3.2 结构
      • 5.3.3 实现
      • 5.3.4 优缺点
    • 5.4 抽象工厂模式
      • 5.4.1 概述
      • 5.4.2 结构
      • 5.4.3 实现
      • 5.4.4 优缺点
      • 5.4.5 使用场景
    • 5.5 工厂模式扩展

五.工厂模式

5.1 概述

引入工厂概念

需求:设计一个咖啡店点餐系统。

设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡AmericanCoffee和拿铁咖啡LatteCoffee);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。

具体类的设计如下:

在这里插入图片描述

//咖啡类
public abstract class Coffee {public abstract String getName();public void addMilk(){System.out.println("加奶...");}public void addSugar(){System.out.println("加糖...");}
}
========================================================
//美式咖啡类
public class AmericanCoffee extends Coffee{@Overridepublic String getName() {return "美式咖啡";}public void show(){System.out.println("我是美式咖啡....");}
}
======================================================
//拿铁咖啡类
public class LatteCoffee extends Coffee{@Overridepublic String getName() {return "拿铁咖啡";}
}
==========================================================
//咖啡店类
public class CoffeeStore {public Coffee orderCoffee(String type){Coffee coffee = null;if ("american".equals(type)){//多态coffee = new AmericanCoffee();}else if ("latte".equals(type)){//多态coffee = new LatteCoffee();}else {throw new RuntimeException("没有这种咖啡!");}// 咖啡加糖加奶coffee.addMilk();coffee.addSugar();return coffee;}
}
=========================================================public class Test {public static void main(String[] args) {// 创建咖啡店类CoffeeStore coffeeStore = new CoffeeStore();// 点咖啡(多态)Coffee coffee = coffeeStore.orderCoffee("latte");//Coffee coffee2 = coffeeStore.orderCoffee("american");// coffee.show();//多态调用不到子类特有的方法// 获取所点咖啡的名字String name = coffee.getName();System.out.println(name);//输出:加奶...  加糖...  拿铁咖啡}
}

在java中,万物皆对象,对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重(CoffeeStore类和AmericanCoffee类以及LatteCoffee类的耦合),假如我们要更换对象(即,添加一个新的咖啡品种),所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象(这里指的是具体的咖啡对象)解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦

5.2简单工厂模式

5.2.1 概述

简单工厂不是一种设计模式,反而比较像是一种编程习惯。

不属于GOF的23种经典设计模式

5.2.2 结构

简单工厂包含下角色:

  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能
  • 具体产品:实现或者继承抽象产品的子类
  • 具体工厂:提供了创建具体产品的方法,调用者通过该方法获取产品对象

5.2.3 实现

对5.1 中案列进行修改

在这里插入图片描述

// 咖啡工厂
public class SimpleFactory {//提供方法,创建具体咖啡public Coffee createCoffee(String type){Coffee coffee = null;if ("american".equals(type)){coffee = new AmericanCoffee(); //多态}else if ("latte".equals(type)){coffee = new LatteCoffee(); //多态}else {throw new RuntimeException("没有这种咖啡!");}return coffee;}
}
=========================================================// 咖啡类(父类)--抽象类
public abstract class Coffee {//每个咖啡都有名字,所以抽取到父类,定义为抽象方法public abstract String getName();public void addMilk(){System.out.println("加奶...");}public void addSugar(){System.out.println("加糖...");}
}
==========================================================// 美式咖啡类 继承 咖啡类
public class AmericanCoffee extends Coffee {@Overridepublic String getName() {return "美式咖啡";}public void show(){System.out.println("我是美式咖啡....");}
}
==========================================================// 拿铁咖啡类 继承 咖啡类
public class LatteCoffee extends Coffee {@Overridepublic String getName() {return "拿铁咖啡";}
}
==========================================================// 咖啡店类
public class CoffeeStore {public Coffee orderCoffee(String type){//此处解除了咖啡店类和具体的咖啡类的依赖,降低了耦合// 创建工厂对象目的是创建具体的咖啡SimpleFactory sf = new SimpleFactory();// 创建咖啡,返回具体的咖啡对象Coffee coffee = sf.createCoffee(type);coffee.addSugar();coffee.addMilk();// 将具体的咖啡对象返回return coffee;}
}
=========================================================public class Test {public static void main(String[] args) {// 创建咖啡店对象,进行点咖啡CoffeeStore store = new CoffeeStore();//隐含了多态,在工厂里Coffee coffee = store.orderCoffee("american");String name = coffee.getName();System.out.println(name);//输出:加奶...  加糖...  美式咖啡}
}

工厂处理创建对象的细节,一旦有了SimpleCoffeeFactory类,CoffeeStore类中的orderCoffee就变成了SimpleCoffeeFactory类的客户,后期如果需要Coffee对象直接从工厂获取即可。这样解除了具体咖啡类和Coffee类的耦合,同时又产生了新的耦合,如:CoffeeStore对象和SimpleCoffeeFactory工厂对象的耦合,工厂对象和具体咖啡对象的耦合。

后期如果再加新品种的咖啡,我们势必要需求修改SimpleCoffeeFactory的代码,违反了开闭原则。但是工厂类的客户端可能有很多,比如创建美团外卖等,这样只需要修改工厂类的代码,省去其他的修改操作。

5.2.4 优缺点

优点:

封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

缺点:

增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。

5.2.5 扩展—静态工厂

将工厂类中的创建对象的功能定义为静态的,这个就是静态工厂模式,它也不是23种设计模式中的。代码如下:

// 咖啡工厂-----静态工厂
public class SimpleFactory {// 工厂类中的创建对象的功能定义为静态,就是静态工厂模式,public static Coffee createCoffee(String type){Coffee coffee = null;if ("american".equals(type)){//多态coffee = new AmericanCoffee();}else if ("latte".equals(type)){//多态coffee = new LatteCoffee();}else {throw new RuntimeException("没有这种咖啡!");}return coffee;}
}
=======================================================// 咖啡类(父类)
public abstract class Coffee {public abstract String getName();public void addMilk(){System.out.println("加奶...");}public void addSugar(){System.out.println("加糖...");}
}
====================================================// 美式咖啡类
public class AmericanCoffee extends Coffee {@Overridepublic String getName() {return "美式咖啡";}public void show(){System.out.println("我是美式咖啡....");}
}
=========================================================// 拿铁咖啡类
public class LatteCoffee extends Coffee {@Overridepublic String getName() {return "拿铁咖啡";}
}
=======================================================// 咖啡店类
public class CoffeeStore {public Coffee orderCoffee(String type){//此处解除了咖啡店类和具体的咖啡类的依赖,降低了耦合//  // 创创建工厂对象目的是创建具体的咖啡// SimpleFactory sf = new SimpleFactory();// // 创建咖啡,返回具体的咖啡对象//  Coffee coffee = sf.createCoffee(type);// 用静态工厂模式,就不用创建工厂对象//直接用工厂类名调用里面的创建具体咖啡对象的静态方法即可Coffee coffee = SimpleFactory.createCoffee(type);coffee.addSugar();coffee.addMilk();// 将具体的咖啡对象返回return coffee;}
}
=========================================================public class Test {public static void main(String[] args) {// 创建咖啡店对象,进行点咖啡CoffeeStore store = new CoffeeStore();//隐含了多态,在工厂里Coffee coffee = store.orderCoffee("american");String name = coffee.getName();System.out.println(name);}
}

5.3 工厂方法模式

针对5.2.3中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。

5.3.1概述

工厂方法模式:定义一个创建对象的接口(这里的接口指的是工厂),让子类(子类 指实现工厂接口的子类)决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

5.3.2 结构

工厂方法模式的主要角色:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过抽象工厂访问具体工厂(多态)的工厂方法来创建产品对象。
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

5.3.3 实现

使用工厂方法模式对5.2.3中的案列进行改进,类图如下:

在这里插入图片描述

// 咖啡抽象类
public abstract class Coffee {public abstract String getName();public void addMilk(){System.out.println("加奶...");}public void addSugar(){System.out.println("加糖...");}
}
============================================================//拿铁咖啡类 实现 抽象咖啡类接口public class LatteCoffee extends Coffee{@Overridepublic String getName() {return "拿铁咖啡";}
}
===========================================================// 美式咖啡类 实现 抽象咖啡类接口
public class AmericanCoffee extends Coffee{@Overridepublic String getName() {return "美式咖啡";}
}
===========================================================
// 定义咖啡工厂接口
public interface CoffeeFactory {public abstract Coffee creatCoffee();
}
========================================================// 创建拿铁咖啡工厂类 实现 咖啡工厂类接口
public class LatteCoffeeFactory implements CoffeeFactory{@Overridepublic Coffee creatCoffee() {return new LatteCoffee();}
}
==========================================================// 创建美式咖啡工厂类 实现 咖啡工厂类接口
public class AmericanCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee creatCoffee() {return new AmericanCoffee();}
}
==========================================================//咖啡店类public class CoffeeStore {private CoffeeFactory coffeeFactory;public void setCoffeeFactory(CoffeeFactory coffeeFactory) {this.coffeeFactory = coffeeFactory;}public Coffee orderCoffee(){// 咖啡工厂来创建具体的咖啡Coffee coffee = coffeeFactory.creatCoffee();// 加配料coffee.addMilk();coffee.addSugar();return coffee;}}
====================================================public class ClientTest {public static void main(String[] args) {// 创建咖啡店类对象CoffeeStore coffeeStore = new CoffeeStore();//创建拿铁咖啡工厂,多态CoffeeFactory coffeeFactory = new LatteCoffeeFactory();//CoffeeFactory amerFactory  = new AmericanCoffeeFactory();coffeeStore.setCoffeeFactory(coffeeFactory);// 点咖啡Coffee coffee = coffeeStore.orderCoffee();System.out.println(coffee.getName());//输出:加奶...  加糖...  拿铁咖啡}
}

5.3.4 优缺点

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

5.4 抽象工厂模式

5.4.1 概述

是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。同族的不同等级的产品:通俗讲就是一个综合工厂里的不同商品种类

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级(即,同种的产品)的产品,而抽象工厂模式可生产多个等级(即,多种产品)的产品。

5.4.2 结构

抽象工厂模式的主要角色如下:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

5.4.3 实现

现咖啡店业务发生改变,不仅要生产咖啡还要生产甜点,如提拉米苏、抹茶慕斯等,要是按照工厂方法模式,需要定义提拉米苏类、抹茶慕斯类、提拉米苏工厂、抹茶慕斯工厂、甜点工厂类,很容易发生类爆炸情况。其中拿铁咖啡、美式咖啡是一个产品等级,都是咖啡;提拉米苏、抹茶慕斯也是一个产品等级;拿铁咖啡和提拉米苏是同一产品族(也就是都属于意大利风味),美式咖啡和抹茶慕斯是同一产品族(也就是都属于美式风味)。所以这个案例可以使用抽象工厂模式实现。类图如下:

在这里插入图片描述

咖啡系列

// 抽象咖啡类
public abstract class Coffee {// 定义获取具体咖啡名字的规范public abstract String getName();// 咖啡加奶public  void addMilk(){System.out.println("加奶...");};// 咖啡加糖public void addSugar(){System.out.println("加糖...");};
}
========================================================
// 具体的 美式咖啡类  继承抽象咖啡类
public class AmericanCoffee extends Coffee{@Overridepublic String getName() {return "美式咖啡";}
}
==========================================================// 具体的 拿铁咖啡类  继承抽象咖啡类
public class LatteCoffee extends Coffee{@Overridepublic String getName() {return "拿铁咖啡";}
}

甜品系列

// 抽象甜品类
public abstract class Dessert {// 定义展示具体甜品的规范public abstract void show();
}
========================================================// 具体甜品--提拉米苏类 继承 抽象甜品类
public class Tiramisu extends Dessert{@Overridepublic void show() {System.out.println("提拉米苏...");}
}
========================================================// 具体甜品--抹茶慕斯类  继承 抽象甜品类
public class MatchaMousse extends Dessert {@Overridepublic void show() {System.out.println("抹茶慕斯...");}
}

工厂系列

 //抽象工厂// 综合工厂 生产咖啡类  生产甜品类
public interface DessertFactory {// 生产咖啡public abstract Coffee createCoffee();// 生产甜品public abstract Dessert createDessert();}
==========================================================//具体工厂// 意大利风味甜品工厂// 生产拿铁咖啡和提拉米苏甜品
public class ItalyDessertFactory implements DessertFactory{// 生产拿铁咖啡@Overridepublic Coffee createCoffee() {return new LatteCoffee();}// 生产提拉米苏@Overridepublic Dessert createDessert() {return new Tiramisu();}
}
=======================================================//具体工厂// 美式风味的甜品工厂// 生美式咖啡 和 抹茶慕斯
public class AmericanDessertFactory implements DessertFactory{// 生产美式咖啡@Overridepublic Coffee createCoffee() {return new AmericanCoffee();}// 生产抹茶慕斯@Overridepublic Dessert createDessert() {return new MatchaMousse();}
}

客户端测试

public class ClientTest {public static void main(String[] args) {
// 客户端测试类// 创建意大利风味甜品工厂对象// 该工厂生产拿铁咖啡 和提拉米苏ItalyDessertFactory factory = new ItalyDessertFactory();// 获取拿铁咖啡Coffee coffee = factory.createCoffee();System.out.println(coffee.getName());//拿铁咖啡// 获取提拉米苏Dessert dessert = factory.createDessert();dessert.show();//提拉米苏...// 创建美式风味的甜品工厂对象//该工厂生产美式咖啡 和抹茶慕斯AmericanDessertFactory factory1 = new AmericanDessertFactory();// 获取美式咖啡Coffee coffee1 = factory1.createCoffee();System.out.println(coffee1.getName());//美式咖啡// 获取抹茶慕斯Dessert dessert1 = factory1.createDessert();dessert1.show();//抹茶慕斯...}
}

如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类。

5.4.4 优缺点

优点:

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

5.4.5 使用场景

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。

  • 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。

  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

如:输入法换皮肤,一整套一起换。生成不同操作系统的程序。

5.5 工厂模式扩展

简单工厂+配置文件解除耦合

(spring底层类似)

可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名,并通过反射技术创建对象进行存储,客户端如果需要对象,直接进行获取即可。

为了演示方便,我们使用properties文件作为配置文件,名称为bean.properties

american=factory.config_factory.AmericanCoffee
latte=factory.config_factory.LatteCoffee#如果冰咖啡饮品,直接添加全类名即可,咖啡工厂中代码不用修改
icecoffee =factory.config_factory.IceCoffee
//咖啡工厂
public class CoffeeFactory {//加载配置文件,获取配置文件中配置的全类名,并创建全类名的类的对象进行存储// 1.定义容器存储咖啡对象private static Map<String,Coffee> map = new HashMap();// 2.静态代码块 加载配置文件,只需加载一次static {// 2.1创建Properties对象Properties p = new Properties();// 2.2调用p对象中的load方法进行配置文件的加载InputStream is = CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");try {p.load(is);//从p集合中获取全名并创建对象//遍历Properties集合对象Set<Object> keys = p.keySet();for (Object key : keys) {//根据键获取值(全类名)String className = p.getProperty((String) key);// 通过反射技术创建对象//获取字节码对象Class clazz = Class.forName(className);Coffee obj = (Coffee) clazz.newInstance();map.put((String)key,obj);}} catch (Exception e) {e.printStackTrace();}}// 根据名称获取对象public static Coffee createCoffee(String name) {return map.get(name);}}
============================================================
// 咖啡类(父类)
public abstract class Coffee {public abstract String getName();public void addMilk(){System.out.println("加奶...");}public void addSugar(){System.out.println("加糖...");}
}
=================================================// 美式咖啡类
public class AmericanCoffee extends Coffee {@Overridepublic String getName() {return "美式咖啡";}public void show(){System.out.println("我是美式咖啡....");}
}
================================================// 拿铁咖啡类
public class LatteCoffee extends Coffee {@Overridepublic String getName() {return "拿铁咖啡";}
}
=======================================================//新增冰咖啡饮品,咖啡工厂类不用修改
public class MiXue extends Coffee{@Overridepublic String getName() {return "冰咖啡";}
}
==================================================public class Test {public static void main(String[] args) {//直接通过配置文件中对应的美式咖啡名字 获取美式咖啡对象Coffee american = CoffeeFactory.createCoffee("american");american.addMilk();american.addSugar();System.out.println(american.getName());//直接通过配置文件中对应的冰咖啡名字 获取冰咖啡对象//新增冰咖啡Coffee icecoffee = CoffeeFactory.createCoffee("icecoffee");icecoffee.addSugar();icecoffee.addMilk();System.out.println(icecoffee.getName());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/445297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言机器学习算法实战系列(三)lightGBM算法(Light Gradient Boosting Machine)

文章目录 介绍原理:应用方向:教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性模型SHAP值解释保存模型总结系统信息介绍 LightGBM(Light Gradient B…

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式&#xff0c;可以使用JacksonTypeHandler处理器。使用方式非常简单&#xff0c;如下所示&#xff1a; 在domain实体类里面要加上&#xff0c;两个注解 TableName(autoResultMap true) 表示自动…

腾讯云-云直播

云直播&#xff08;Cloud Streaming Services&#xff09;为您提供极速、稳定、专业的直播云端处理服务&#xff0c;根据业务中不同直播场景的需求&#xff0c;云直播提供标准直播、快直播、慢直播和云导播台服务&#xff0c;分别针对大规模实时观看、高并发推流录制及超低延时…

数学建模算法与应用 第11章 偏最小二乘回归及其方法

目录 11.1 偏最小二乘回归概述 11.2 Matlab 偏最小二乘回归命令 Matlab代码示例&#xff1a;偏最小二乘回归 11.3 案例分析&#xff1a;化学反应中的偏最小二乘回归 Matlab代码示例&#xff1a;光谱数据的PLS回归 习题 11 总结 偏最小二乘回归&#xff08;Partial Least …

如何加密重要U盘?U盘怎么加密保护?

在日常生活中&#xff0c;我们常常使用U盘来存储和传输重要文件。然而&#xff0c;U盘的便携性也意味着它容易丢失或被盗。为了保护U盘中的数据安全&#xff0c;我们需要对U盘进行加密。本文将为您介绍如何加密重要U盘&#xff0c;以及U盘加密保护的方法。 BitLocker BitLocke…

动态规划——多状态动态规划问题

目录 一、打家劫舍 二、打家劫舍 II 三、删除并获得点数 四、粉刷房子 五、买卖股票的最佳时机含冷冻期 六、买卖股票的最佳时机含手续费 七、买卖股票的最佳时机III 八、买卖股票的最佳时机IV 一、打家劫舍 打家劫舍 第一步&#xff1a;确定状态表示 当我们每次…

『Mysql进阶』Mysql SQL语句性能分析(七)

目录 什么是Profile&#xff1f; 开启Profile功能 基本使用 分析案例 什么是Profile&#xff1f; Query Profiler是 MySQL 自带的一种 Query 诊断分析工具 &#xff0c;通过它可以分析出一条 SQL 语句的 硬件性能瓶颈 在什么地方。 通常我们是使用的 explain &#xff0c;…

企业内部文档安全外发如何挑选合适的外发系统?

企业文档的外发不仅关系到运营效率&#xff0c;更是信息安全的重要组成部分。面对B2B模式下文档交换的普遍性和重要性&#xff0c;企业内部文档的安全外发成为了众多公司关注的重点之一。 随着互联网技术的发展&#xff0c;企业之间的合作越来越紧密&#xff0c;文档的交流也变…

springboot+react实现移动端相册(上传图片到oss/ 批量删除/ 查看图片详情等功能)

相册页面及功能展示&#xff1a; react前端结构及代码&#xff1a; Java后端结构及代码 数据库结构&#xff1a; photo&#xff1a; user 这是首个利用AI自有知识构建的简易相册系统&#xff0c;项目是react构造前端spring boot构造后端。 前端有四个主要页面&#xff1…

Compose第六弹 对话框与弹窗

1.compose中怎么使用对话框&#xff1f; 2.怎么显示Popup弹窗&#xff1f; 一、Compose显示对话框 二、Popup Popup就类似以前的Popupwindow&#xff0c;我们可以看到其实上面的DropdownMenu是Popup的一个具体实现。 2.1 Popup定义 Popup的定义如下&#xff1a; Composable…

Windows 下 cocos2d-x-3.17.2 VS2017开发环境搭建

1.下载cocos2d-x-3.17.2 源码: Cocos2d-x - 成熟、轻量、开放的跨平台解决方案 2.下载Python2 Python 2.7.0 Release | Python.org 加入环境变量: 测试版本

JAVA基础 day12

一、File、IO流 File是java.io.包下的类&#xff0c;file类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以代表文件、文件夹&#xff09;&#xff0c;使用File可以操作文件及文件夹。 注意&#xff1a;File只能对文件本身进行操作&#xff0c;不能读写文件里…

哈夫曼树和哈夫曼编码

现在需要对下列字符编码 其中我么你发现A 出现三次&#xff0c;B出现一次&#xff0c;C出现两次&#xff0c;D出现一次 那么我们统计出现次数为&#xff1a;3&#xff0c;2&#xff0c;1&#xff0c;1 我们将1&#xff0c;1组成一个树 现在统计次数变为3&#xff0c;2&#x…

Java—继承性与多态性

目录 一、this关键字 1. 理解this 2. this练习 二、继承性 2.1 继承性的理解 2.1.1 多层继承 2.2 继承性的使用练习 2.2.1 练习1 2.2.2 练习2 2.3 方法的重写 2.4 super关键字 2.4.1 子类对象实例化 三、多态性 3.1 多态性的理解 3.2 向下转型与多态练习 四、Ob…

构建高效作业管理平台:Spring Boot师生协作评审系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

神经网络超参数优化

遗传算法与深度学习实战&#xff08;16&#xff09;——神经网络超参数优化 0. 前言1. 深度学习基础1.1 传统机器学习1.2 深度学习 2. 神经网络超参数调整2.1 超参数调整策略2.2 超参数调整对神经网络影响 3. 超参数调整规则小结系列链接 0. 前言 我们已经学习了多种形式的进化…

鸿蒙开发实战项目【硅谷租房】--- 项目介绍

目录 一、简述 二、项目资料 2.1 UI设计稿 2.2 服务器 2.3 Apifox接口JSON文件 使用 Apifox 测试接口 一、简述 这是一个基于 鸿蒙 API12 开发的移动端租房 App&#xff0c;用户可以使用该应用搜索租房列表、查看房屋详情、预约租房等。 该项目的tabbar包含五部分&…

网站集群批量管理-Ansible(ad-hoc)

1. 概述 1. 自动化运维: 批量管理,批量分发,批量执行,维护 2. 无客户端,基于ssh进行管理与维护 2. 环境准备 环境主机ansible10.0.0.7(管理节点)nfs01 10.0.0.31(被管理节点)backup10.0.0.41(被管理节点) 2.1 创建密钥认证 安装sshpass yum install -y sshpass #!/bin/bash ##…

Android终端GB28181音视频实时回传设计探讨

技术背景 好多开发者&#xff0c;在调研Android平台GB28181实时回传的时候&#xff0c;对这块整体的流程&#xff0c;没有个整体的了解&#xff0c;本文以大牛直播SDK的SmartGBD设计开发为例&#xff0c;聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…

操作系统导论阅读 - 虚拟化

近期系统性地过一下操作系统导论 第二章 操作系统介绍 冯诺伊曼架构 冯诺依曼架构的核心思想&#xff1a; 使用二进制存储数据像存储数据一样来存储程序计算机由输入设备&#xff0c;输出设备以及控制器&#xff0c;运算器和存储器五部分组成 通常使用的键盘&#xff0c;…