第八天 自定义类型方法集合混合使用【悟空教程】

第08天 自定义类型&方法&集合混合使用

第1章 引用类型作为参数与返回值

1.1 引用类型是一种数据类型

自定义引用类型与int、double等数据类型相同,均是一种数据类型。当方法定义参数与返回值类型时,可以定位基本数据类型,也可以定义为引用数据类型,二者在定义上没有任何差别。

基本类型与引用类型传参过程中,仅仅是值的数据类型不同。

如:

基本类型int传参时,赋值为10,是一个具体数值

引用类型Person传参时,赋值为new Person(),是一个地址值,如0x8372

1.2 引用类型定义方法与返回值为参数练习

1.定义方法,基本类型作为参数 如:求两个数的和

/*

定义方法,基本类型作为参数 如:求两个整数的和

*/

public class Test1

{

public static void main(String[] args)

{

int a = 10;

int b = 20;

int he = sum(a,b);

System.out.println(he);

System.out.println(a);

System.out.println(b);

}

//求两个整数的和 参数 两个整数 返回值 一个整数

public static int sum(int a, int b){

a = 2 * a;

b = 2 * b;

int he = a + b;

return he;

}

}

2.定义方法,数组作为参数 如:打印数组中所有偶数

/*

定义方法,数组作为参数 如:打印数组中所有偶数

*/

public class Test2

{

public static void main(String[] args)

{

int[] arr ={3,8,2,5,0};

showOuShu(arr);

}

//打印数组中所有偶数 参数 一个整数数组 返回值 无

public static void showOuShu(int[] arr){

int count = 0;

//遍历数组,依次获取数组中每个数值,判断这个数值是否为偶数,如果是则打印

for(int i = 0 ;i<arr.length;i++){

//依次获取数组中每个数值

int number = arr[i];

//判断这个数值是否为偶数

if(number % 2 ==0){

//如果是则打印

System.out.println(number);

count++;

}

}

System.out.println("偶数个数:"+count);

}

}

3.定义方法,集合作为参数 如:打印集合中所有偶数

/*

定义方法,集合作为参数 如:打印集合中所有偶数

*/

//导入ArrayList

import java.util.ArrayList;

public class Test3

{

public static void main(String[] args)

{

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(3);

list.add(8);

list.add(2);

list.add(5);

list.add(0);

showOuShu(list);

}

//打印集合中所有偶数 参数 一个存储整数的集合 返回值 void

/*

遍历集合

依次获取集合中所有的数据

判断数据是否为偶数

如果是 则打印

*/

public static void showOuShu(ArrayList<Integer> list){

//遍历集合

for(int i = 0 ;i < list.size();i++){

//依次获取集合中所有的数据

int number = list.get(i);

//判断数据是否为偶数

if(number % 2 == 0){

System.out.println(number);

}

}

}

}

4.定义方法,自定义数据类型作为参数 如:将一个人的年龄增长10岁

public class Person

{

String name;

int age;

}

/*

定义方法,自定义数据类型作为参数 如:将一个人的年龄增长10岁

*/

public class Test4

{

public static void main(String[] args)

{

Person p = new Person();

addAge(p);

System.out.println("---------------------------");

System.out.println(p.age);

}

//将一个人的年龄增长10岁 参数 一个人 返回值 void

public static void addAge(Person p){

p.age+=10;

System.out.println(p.age);

}

}

同样,我们也可以尝试各种数据类型作为返回值使用。

1.3 引用类型传参与基本类型传参区别

  • 当基本类型传参时,栈内存中,各个方法内的变量互不相关,仅存在一个相互赋值的动作。
  • 当引用类型传参时,各个方法内的引用变量指向同一个堆内存中的对象,任何一个引用修改了对象,其他引用再使用时,均访问的是修改后的变量。

/*

自定义数据类型 Animal类

属性

姓名 String

年龄 int

种类 String

*/

public class Animal

{

String name;

int age;

String kind;

}

/*

定义一个方法 从一群小动物中,找出所有年龄大于3的小动物,将这些小动物放在一个集合中,并返回,在main方法中遍历返回的集合,打印所有年龄大于3的小动物的信息

*/

//导入ArrayList

import java.util.ArrayList;

public class Test5

{

public static void main(String[] args)

{

//存储所有动物的集合

ArrayList<Animal> list = new ArrayList<Animal>();

//向集合中添加动物

Animal a1 = new Animal();

a1.name = "柳岩";

a1.age = 38;

a1.kind = "女人";

Animal a2 = new Animal();

a2.name = "点点";

a2.age = 3;

a2.kind = "斑点狗";

Animal a3 = new Animal();

a3.name = "小白";

a3.age = 2;

a3.kind = "白痴猫";

Animal a4 = new Animal();

a4.name = "小金";

a4.age = 4;

a4.kind = "金丝猴";

//将所有动物存储到集合中

list.add(a1);

list.add(a2);

list.add(a3);

list.add(a4);

//调用检查年龄的方法 返回一个年龄大于3的动物的集合

ArrayList<Animal> checkList = checkAnimals(list);

//遍历返回的集合,打印所有年龄大于3的小动物的信息

for(int i = 0 ;i < checkList.size();i++){

//依次获取每个年龄大于3的小动物

Animal thisA = checkList.get(i);

System.out.println("姓名:"+thisA.name);

System.out.println("年龄:"+thisA.age);

System.out.println("品种:"+thisA.kind);

System.out.println("------------------------");

}

}

/*

1.定义一个动物类

2.定义方法 方法参数 一个存储所有动物的集合 返回值 一个存储所有年龄大于三的动物的集合

a.定义一个集合用来存储年龄大于3的动物

b.遍历所有动物的集合,依次获取每个动物

c.判断每个动物的年龄是否大于3

d.如果大于3,将当前这个动物存储到年龄大于三的动物的集合

e.返回 年龄大于3的动物的集合

*/

public static ArrayList<Animal> checkAnimals(ArrayList<Animal> list){

//定义一个存储年龄大于3动物的集合

ArrayList<Animal> checkList = new ArrayList<Animal>();

//遍历所有动物的集合 list

for(int i = 0 ;i < list.size();i++){

//依次获取每个动物

Animal thisA = list.get(i);

//判断每个动物的年龄是否大于3

if(thisA.age >3){

//将当前这个动物存储到年龄大于三的动物的集合

checkList.add(thisA);

}

}

//返回 年龄大于3的动物的集合

return checkList;

}

}

第2章 综合案例---超市购物小票封装自定义类

2.0.1 案例介绍与演示

将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对象。

2.0.2 案例分析

a) 案例回顾

在超市购物小票案例中,我们封装了三个方法,在switch中为3个case执行用户选择的三个不同的操作:1输入购买数量 2打印购物小票 3退出系统

而所有的变量均”零散地”定义在成员位置。

b) 重构内容分析

1:将原来的成员位置零散定义的变量,封装为商品项GoodsItem对象。

2:将所有使用变量值的地方全部改为使用GoodsItem对象

c) 实现步骤

  • 定义Person类

定义Person类,包含成员变量名称、年龄、地址

  • 重构使用到变量的逻辑

将所有使用到成员位置商品属性的代码处,均由直接使用改为通过对象名访问对象属性的方式。

/*

自定义数据类型 商品项类

属性

商品名称 String

商品id String

商品单价 double

商品数量 int

商品金额 double

*/

public class GoodsItem

{

//商品名称

String name;

//商品id

String id;

//商品单价

double price ;

//商品数量

int number;

//商品金额

double money;

}

/*

使用switch语句完成三个分支的代码逻辑

当用户输入1时,让用户输入所要购买的商品数量

当用户输入2时,给用户打印出对应的购物小票

当用户输入3时,退出系统

1.定义商品数据

2.提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统

3.接收用户输入的选择

4.使用switch进行判断

5.整体是一个死循环

代码重构

1.定义一个商品项类

2.在成员位置创建两个商品对象

3.给两个商品对象的属性赋值

定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无

4.修改购买方法和打印小票方法 因为里边访问的变量都不存在了 需要改成商品对象去访问属性的方式

*/

//导入Scanner

import java.util.Scanner;

public class Supermarket

{

//定义少林寺酥饼核桃商品对象

static GoodsItem sls = new GoodsItem();

//定义然光Q移商品对象

static GoodsItem rg = new GoodsItem();

public static void main(String[] args)

{

//调用init方法 用来初始化数据

init();

while(true){

//提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统

System.out.println("请输入您的操作:1.输入商品数量 2.打印购物小票 3.退出系统");

//接收用户输入的选择 使用Scanner完成

// Scanner sc = new Scanner(System.in);

//调用nextInt方法 接收用户的选择

// int choose = sc.nextInt();

//调用键盘录入整数方法enterNumber接收用户输入的选择

int choose = enterNumber();

//使用switch进行判断用户的选择

switch(choose){

case 1:

//调用buy方法 完成用户输入商品数量

buy();

break;

case 2:

//调用printTicket方法 打印购物小票

printTicket();

break;

case 3:

System.out.println("爱买不买,下次带钱来!!");

System.exit(0);

break;

default:

System.out.println("你瞎啊!");

break;

}

}

}

//定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无

public static void init(){

//给少林寺对象赋值

sls.name = "少林寺酥饼核桃";

sls.id = "090115";

sls.price = 15.50;

//给然光对象赋值

rg.name = "然光Q移";

rg.id = "090028";

rg.price = 16.00;

}

//定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数

public static int enterNumber(){

Scanner sc = new Scanner(System.in);

int number = sc.nextInt();

return number;

}

//将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无

public static void buy(){

Scanner sc = new Scanner(System.in);

//依次让用户给每个商品的数量重新赋值

System.out.println("请输入少林寺酥饼核桃的购买数量:");

sls.number = sc.nextInt();

sls.money = sls.number*sls.price;

System.out.println("请输入然光Q移的购买数量:");

rg.number = sc.nextInt();

rg.money = rg.number*rg.price;

}

//打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无

public static void printTicket(){

//===============票头=========================

System.out.println(" 欢 迎 光 临");

System.out.println("品名 售价 数量 金额");

System.out.println("-------------------------------------");

//===============票体=========================

System.out.println(sls.name+"("+sls.id+")"+" "+sls.price+" * "+sls.number+" = "+sls.money);

System.out.println(rg.name+"("+rg.id+")"+" "+rg.price+" * "+rg.number+" = "+rg.money);

System.out.println("-------------------------------------");

//===============票脚=========================

//项数

int lineNumber = 2;

//总数量

int totalNumber = sls.number + rg.number;

//总金额

double totalMoney = sls.money + rg.money;

System.out.println(lineNumber+" 项商品 共计:"+totalNumber+" 件");

System.out.println("总计:"+totalMoney);

}

}

第3章 综合案例---超市购物小票数据使用集合

3.0.1 案例介绍与演示

将本日第二章内容所有的Person对象放置到集合中使用。

3.0.2 案例分析

a) 重构内容分析

1:将原来的成员位置的多个商品项GoodsItem对象封装到一个ArrayList集合中

2:将所有使用变量值的地方全部改为先从集合中后去对象,再使用GoodsItem对象获取属性值的方式。

b) 实现步骤

  • 成员位置定义ArrayList集合
  • 定义方法,用于为集合赋值,准备要操作的数据。
  • 重构使用到变量的逻辑

将所有使用到成员位置商品项的代码处,均由使用对象名访问对象属性的方式改为先从集合中获取对象,再获取属性值的方式。

3.0.3 自定义类型与集合的使用优点分析

当使用自定义类型时,将数据与数据之间产生了合理必要的联系:一个商品的属性应都属于一个商品,则可以以一个商品作为数据操作的基本单位。

当使用集合时,由原来成员位置定义多个对象改为定义一个集合对象。所有使用数据的地方循环遍历即可,无论有再多新数据的产生,其代码不需要更改。

/*

自定义数据类型 商品项类

属性

商品名称 String

商品id String

商品单价 double

商品数量 int

商品金额 double

*/

public class GoodsItem

{

//商品名称

String name;

//商品id

String id;

//商品单价

double price ;

//商品数量

int number;

//商品金额

double money;

}

/*

使用switch语句完成三个分支的代码逻辑

当用户输入1时,让用户输入所要购买的商品数量

当用户输入2时,给用户打印出对应的购物小票

当用户输入3时,退出系统

1.定义商品数据

2.提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统

3.接收用户输入的选择

4.使用switch进行判断

5.整体是一个死循环

代码重构

准备数据

1.定义一个商品项类

2.在成员位置定义一个集合 用来存储所有商品

3.为成员位置的集合初始化商品

4.修改购买和打印小票方法 将商品对象从集合中取出来,访问商品对象的属性

*/

//导入Scanner

import java.util.Scanner;

//导入ArrayList

import java.util.ArrayList;

public class Supermarket2

{

//在成员位置定义一个集合 用来存储所有商品

static ArrayList<GoodsItem> list = new ArrayList<GoodsItem>();

public static void main(String[] args)

{

//调用init方法 用来初始化数据

init();

while(true){

//提示用户输入相对应的操作 1.输入商品数量 2.打印小票 3.退出系统

System.out.println("请输入您的操作:1.输入商品数量 2.打印购物小票 3.退出系统");

//接收用户输入的选择 使用Scanner完成

int choose = enterNumber();

//使用switch进行判断用户的选择

switch(choose){

case 1:

//调用buy方法 完成用户输入商品数量

buy();

break;

case 2:

//调用printTicket方法 打印购物小票

printTicket();

break;

case 3:

System.out.println("爱买不买,下次带钱来!!");

System.exit(0);

break;

default:

System.out.println("你瞎啊!");

break;

}

}

}

//定义一个方法为商品对象初始化属性的方法 方法名 init 参数 无 返回值 无

public static void init(){

//定义少林寺酥饼核桃商品对象

GoodsItem sls = new GoodsItem();

//给少林寺对象赋值

sls.name = "少林寺酥饼核桃";

sls.id = "090115";

sls.price = 15.50;

//定义然光Q移商品对象

GoodsItem rg = new GoodsItem();

//给然光对象赋值

rg.name = "然光Q移";

rg.id = "090028";

rg.price = 16.00;

//定义人参果商品对象

GoodsItem rsg = new GoodsItem();

//给然光对象赋值

rsg.name = "人参果";

rsg.id = "090001";

rsg.price = 111111.00;

//将商品对象添加到集合中

list.add(sls);

list.add(rg);

list.add(rsg);

}

//定义一个键盘录入整数的方法 方法名 enterNumber 需要的数据 无 返回的数据 一个用户输入的整数

public static int enterNumber(){

Scanner sc = new Scanner(System.in);

int number = sc.nextInt();

return number;

}

//将用户输入商品数量封装成方法 方法名 buy 需要的数据 无 返回的数据 无

public static void buy(){

Scanner sc = new Scanner(System.in);

/*

遍历存储商品的集合list,依次获取每个商品

让用户给每个商品的数量赋值

计算每个商品的金额

*/

for(int i = 0 ;i < list.size();i++){

//依次获取每个商品

GoodsItem thisItem = list.get(i);

System.out.println("请输入"+thisItem.name+"商品的购买数量:");

//让用户给每个商品的数量赋值

thisItem.number = sc.nextInt();

//计算每个商品的金额

thisItem.money = thisItem.number * thisItem.price;

}

}

//打印购物小票方法 方法名 printTicket 需要的数据 无 返回的数据 无

public static void printTicket(){

//===============票头=========================

System.out.println(" 欢 迎 光 临");

System.out.println("品名 售价 数量 金额");

System.out.println("-------------------------------------");

//===============票体=========================

/*

遍历商品集合,依次获取每个商品,打印每个商品的属性

*/

for(int i = 0 ;i<list.size();i++){

//依次获取每个商品

GoodsItem thisItem = list.get(i);

//依次获取每个商品

System.out.println(thisItem.name+"("+thisItem.id+")"+" "+thisItem.price+" * "+thisItem.number+" = "+thisItem.money);

}

//System.out.println(sls.name+"("+sls.id+")"+" "+sls.price+" * "+sls.number+" = "+sls.money);

//System.out.println(rg.name+"("+rg.id+")"+" "+rg.price+" * "+rg.number+" = "+rg.money);

System.out.println("-------------------------------------");

//===============票脚=========================

//项数

int lineNumber = list.size();

//总数量

int totalNumber = 0;

//总金额

double totalMoney = 0.0;

/*

遍历商品集合 ,依次获取每个商品

将每个商品的数量累加

将每个商品的金额累加

*/

//遍历商品集合

for(int i = 0 ;i < list.size();i++){

//依次获取每个商品

GoodsItem thisItem = list.get(i);

//总数量

totalNumber += thisItem.number;

//总金额

totalMoney += thisItem.money;

}

System.out.println(lineNumber+" 项商品 共计:"+totalNumber+" 件");

System.out.println("总计:"+totalMoney);

}

}

第4章 综合案例---超市购物小票(之前知识)

4.1 案例介绍与演示

使用Eclipse完成day07超市购物小票案例。

package cn.javahelp2;

/*

* 自定义数据类型 商品项类

*

* 属性

*

* 商品id String

* 商品名称 String

* 商品单价 double

* 商品数量 int

* 商品金额 double

*/

public class GoodsItem {

String id;

String name;

double price;

int number;

double money;

}

package cn.javahelp2;

import java.util.ArrayList;

import java.util.Scanner;

/*

* 使用switch语句完成三个分支的代码逻辑

* 当用户输入1时,让用户输入所要购买的商品数量

* 当用户输入2时,给用户打印出对应的购物小票

* 当用户输入3时,退出系统

*

* 分析

* 准备数据

* 1.定义一个商品类

* 2.在成员位置定义一个集合 用来存储所有商品

* 3.定义一个方法 init方法 为集合初始化数据

* 完成整体流程

* 4.提示用户输入相对应的操作 1.购买 2.打印小票 3.退出购买

* 5.接收用户输入的操作

* 调用Scanner的nextInt方法

* 6.使用switch对用户的操作进行判断

* 7.整体流程是一个死循环

* 完成每个方法

* 8.完成购买方法 为集合中每个商品的数量赋值

* 9.完成打印小票方法

* 票头 死数据打印

* 票体 依次打印集合中每个商品的属性

* 票脚 求和

*

*/

public class Supermarket {

//在成员位置定义一个集合 用来存储所有商品

static ArrayList<GoodsItem> list = new ArrayList<GoodsItem>();

public static void main(String[] args) {

//调用init方法为商品集合初始化数据

init();

//整体流程是一个死循环

while(true){

//提示用户输入相对应的操作 1.购买 2.打印小票 3.退出购买

System.out.println("请输入相对应的操作: 1.购买 2.打印小票 3.退出系统");

//接收用户输入的操作

Scanner sc = new Scanner(System.in);

int choose = sc.nextInt();

//使用switch对用户的操作进行判断

switch (choose) {

case 1:

buy();

break;

case 2:

printTicket();

break;

case 3:

System.out.println("爱买不买,下次带钱来!");

System.exit(0);

break;

default:

System.out.println("你瞎啊?这都看不到么!!");

break;

}

}

}

//完成打印小票方法

/*

* 票头

* 死数据打印

* 票体

* 依次打印集合中每个商品的属性

* 遍历集合,依次获取每个商品,打印每个商品的属性信息

* 票脚

* 项数 集合的长度

* 求总数量 所有商品数量的和

* 总金额 所有商品金额的和

* 遍历集合,依次获取每个商品

* 商品数量累加

* 商品金额累加

*/

public static void printTicket() {

//票头

System.out.println(" 欢迎欢迎 !! 热烈欢迎!!");

System.out.println("商品名称 商品单价 商品数量 商品金额");

System.out.println("---------------------------------------");

//票体 遍历集合,依次获取每个商品,打印每个商品的属性信息

for (int i = 0; i < list.size(); i++) {

//依次获取每个商品

GoodsItem thisItem = list.get(i);

//打印每个商品的属性信息

System.out.println(thisItem.name+"("+thisItem.id+")"+" "+thisItem.price+" * "+thisItem.number+" = "+thisItem.money);

}

System.out.println("---------------------------------------");

//票脚

//项数

int lineNumber = list.size();

//总数量

int totalNumber = 0;

//总金额

double totalMoney = 0.0;

//遍历集合,依次获取每个商品

for (int i = 0; i < list.size(); i++) {

//依次获取每个商品

GoodsItem thisItem = list.get(i);

//求总数量

totalNumber += thisItem.number;

//求总金额

totalMoney += thisItem.money;

}

System.out.println(lineNumber+" 项商品 共计:"+totalNumber+"件");

System.out.println("总价:"+totalMoney+"元");

}

//完成购买方法 为集合中每个商品的数量赋值

/*

* 1.创建Scanner对象

* 2.遍历集合,依次获取每个商品,让用户为每个商品的数量赋值,计算商品金额

*/

public static void buy() {

//创建Scanner对象

Scanner sc = new Scanner(System.in);

//遍历集合,依次获取每个商品,让用户为每个商品的数量赋值,计算商品金额

for (int i = 0; i < list.size(); i++) {

//依次获取每个商品

GoodsItem thisItem = list.get(i);

//让用户为每个商品的数量赋值

System.out.println("请输入"+thisItem.name+"商品的购买数量:");

thisItem.number = sc.nextInt();

//计算商品金额

thisItem.money = thisItem.number * thisItem.price;

}

}

//定义一个方法 init方法 为集合初始化数据

/*

* 创建商品对象 给商品对象的属性赋值

* 将商品对象添加到成员位置的集合中

*/

public static void init(){

// 创建商品对象 给商品对象的属性赋值

GoodsItem sls = new GoodsItem();

sls.id = "090018";

sls.name = "少林寺酥饼核桃";

sls.price = 15.50;

GoodsItem rg = new GoodsItem();

rg.id = "090025";

rg.name = "然光Q移";

rg.price = 16.00;

GoodsItem rsg = new GoodsItem();

rsg.id = "090001";

rsg.name = "人参果";

rsg.price = 16000.00;

//将商品对象添加到成员位置的集合中

list.add(sls);

list.add(rg);

list.add(rsg);

}

}

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈满iOS

编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型

这篇文章综合介绍了四种分类,特别地,为了方便大家快速有效的学习,笔者尝试用思维导图的办法描述编程语言的区别。一般来讲,看第一个图就够了。但如果你想更深入地了解,...

541
来自专栏java一日一条

代码优化那些事

/**************************************************************************/

473
来自专栏nnngu

经典Java面试题收集

2、访问修饰符public,private,protected,以及不写(默认)时的区别?

93113
来自专栏刘望舒

kotlin到底好在哪里?

最近在学kotlin,虽然还没有像其他博主一样立马就爱上它.但是不得不说,kotlin对比起java还是有不少优势的. 1、语法简洁 首先是语法比较简洁,能不简...

3397
来自专栏算法channel

面试被问到动态内存分配时需要注意哪些坑,该怎么回答?

面试时,面试官问我们Java,Python这种语言那是必须要准确回答的,很多系统如果对性能要求高的话,底层一般会用到C/C++语言,因此被问到底层语言的相关知识...

1043
来自专栏python3

python3--变量,布尔值,用户交互 input,if语句,while循环

已经运行了第一个python程序,即:终端---->cmd----->python 文件路劲。回车搞定~

852
来自专栏wym

线段树理论基础

线段树(segment tree)是一种二叉搜索树,它的每一个结点对应着一个区间[L,R],叶子节点对应的是一个单位区间,即L==R。

973
来自专栏维C果糖

编程思想 之「对象漫谈」

在「语言导论」中,我们曾提到过「万物皆对象」,事实上,也确实如此。在面向对象编程的世界中,我们创建对象、操作对象、销毁对象,我们所做的一切动作都离不开对象。在本...

54619
来自专栏Java Edge

设计实现一个LRU Cache1 什么是LRU Cache2 实现思路

3387
来自专栏向治洪

工厂模式

工厂模式 何为工厂模式:定义一个用于创建对象的接口,让子类去决定实例化那一个类,FactoryMethod可以使一个类的实例化延迟到其子类。 工厂模式分类 工厂...

1738

扫码关注云+社区