单多例模式,枚举,正则,工厂模式

单多例模式,枚举,正则,工厂模式

今日内容

  • 单列模式
    • 懒汉式
    • 饿汉式
  • 多例模式
  • 枚举
  • 工厂模式
  • 正则表达式

第一章 单例模式

1.懒汉式

/*
单例模式有两种,分别叫做懒汉式【后创建对象】和饿汉式【先创建对象】
下面单利模式是懒汉式,是在调用getDog方法之后创建的对象。
*/
public class Dog {
//定义Dog类型的变量
private static Dog dog = null;//

private Dog() {

}

/*
提供静态方法,用来获取Dog对象
*/
public static synchronized Dog getDog() {
//当调用getDog方法时,判断变量dog是否是null,如果dog是null,那么就创建一个Dog对象赋值给成员变量dog
if (dog == null) {
dog = new Dog();
}
//创建Dog对象,并返回
return dog;
}

}
public class Demo01DogTest {
public static void main(String[] args) {
System.out.println(Dog.getDog());
System.out.println(Dog.getDog());
System.out.println(Dog.getDog());
System.out.println(Dog.getDog());
System.out.println(Dog.getDog());
}
}

2.饿汉式

/*
单例模式饿汉式【先创建对象】
1. 将构造方法私有,防止外界使用new关键字创建对象。
2. 提供静态的属性,并创建对象
3. 提供静态方法,用来获取对象
*/
public class Cat {
//将构造方法私有,防止外界使用new关键字创建对象。
private Cat() {
}

//提供静态的属性,并创建对象【因为该属性是静态的,所以这段代码只执行一次,只创建一个Cat对象】
private static Cat cat = new Cat();

//提供静态方法,用来获取对象
public static Cat getCat() {
return cat;
}
}
public class Demo02CatTest {
public static void main(String[] args) {
System.out.println(Cat.getCat());
System.out.println(Cat.getCat());
System.out.println(Cat.getCat());
System.out.println(Cat.getCat());
System.out.println(Cat.getCat());
}
}

第二章 多例模式

/*
多例模式,要求程序中的Person对象创建三个

步骤:
1. 在类中将构造方法私有,让外界无法直接创建对象
2. 创建集合,用来保存程序中所有的Person对象。
3. 定义一个静态代码块,在静态代码块中创建Person对象,并添加到集合中。
4. 定义方法,用来随机获取程序中的Person对象
*/
public class Person {
//在类中将构造方法私有,让外界无法直接创建对象
private Person() {

}

//创建集合,用来保存程序中所有的Person对象。
private static List<Person> list = new ArrayList<>();

//定义一个静态代码块,在静态代码块中创建Person对象,并添加到集合中。
static {
for (int i = 0; i < 3; i++) {
list.add(new Person());
}
}

//定义方法,用来随机获取程序中的Person对象
public static Person getPerson() {
//生成随机的索引
Random r = new Random();
int randomIndex = r.nextInt(list.size());
//根据这个随机的索引从集合中获取元素然后返回
return list.get(randomIndex);
}
}
public class Demo01Test {
public static void main(String[] args) {
//通过Person调用getPerson方法获取对象
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
System.out.println(Person.getPerson());
}
}

第三章 枚举

/*
枚举本质就是类,枚举是多例的一种体现。
在枚举中我们可以给出一些属性,枚举中的每个属性都是自身的对象。
格式
public enum 枚举名 {
属性,属性,属性
}

枚举中的属性在命名时建议全部大写,多个单词之间使用下划线隔开。
枚举中的属性默认使用了static final进行修饰,因为使用static修饰了,所以我们可以通过枚举名直接使用里面的属性。
*/
public enum Gender {
//男
BOY,
//女
GIRL
}
public class Person {
//姓名
private String name;
//性别
private Gender gender;

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender=" + gender +
'}';
}

public Person() {
}

public Person(String name, Gender gender) {

this.name = name;
this.gender = gender;
}

public String getName() {

return name;
}

public void setName(String name) {
this.name = name;
}

public Gender getGender() {
return gender;
}

public void setGender(Gender gender) {
this.gender = gender;
}
}
public class Demo01Test {
public static void main(String[] args) {
//创建Person对象
Person p = new Person();
//调用set方法进行赋值
p.setName("张三");
p.setGender(Gender.BOY);
//输出
System.out.println(p);
}
}

第四章工厂模式

/*
工厂设计模式可以让我们通过工厂的方式去获取对象
1. 定义Car作为父类,里面提供run方法。
2. 定义子类FaLaLi,继承Car
3. 定义Factory工厂类,里面提供一个获取Car小汽车的方法。
4. 在测试类中通过工厂获取小汽车对象

工厂设计模式的好处:可以降低耦合性(关联性)

*/
public class Demo01Test {
public static void main(String[] args) {
Car car = CarFactory.getCar("法拉利");
car.run();
}
}
/*
小汽车类(父类)
*/
public abstract class Car {
public abstract void run();
}
/*
用来生产小汽车的工厂
*/
public class CarFactory {
/*
定义方法,用来获取小汽车
*/
public static Car getCar(String carName) {
//判断如果carName是法拉利,就返回法拉利对象
if (carName.equals("法拉利")) {
return new FaLali();
} else if (carName.equals("奥拓")) {
return new AoTuo();
} else {
//其他的全部返回null值
return null;
}
}
}
public class AoTuo extends Car{
@Override
public void run() {
System.out.println("奥拓在慢慢跑");
}
}
public class FaLali extends Car{
@Override
public void run() {
System.out.println("法拉利在快速的奔跑");
}
}

第五章正则表达式

1.正则表达式的使用

/*
正则表达式可以验证一个字符串是否符合规则。

String中有一个用来使用正则表达式验证规则方法
boolean matches(String regex):根据正则表达式验证字符串是否符合规则

正则表达式的规则:
[abc]:代表a或者b,或者c字符中的一个。
[^abc]:代表除a,b,c以外的任何字符。
[a-z]:代表a-z的所有小写字符中的一个。
[A-Z]:代表A-Z的所有大写字符中的一个。
[0-9]:代表0-9之间的某一个数字字符。
[a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
[a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。

\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

?:0次或1次
*:任意次
+:1次或多次
{n}:出现n次
{n,}:至少n次
{n,m}:至少n次,最多m次

*/
public class Demo01String {
public static void main(String[] args) {
//验证QQ号是否符合规则。要求: 必须是5-12位的数字, 首位不能是0
String qq = "124959292";
boolean flag = qq.matches("[1-9][0-9]{4,11}");
System.out.println(flag);
//验证手机号是否符合规则。 要求:必须是11位,第一位必须是1, 第二位必须是3,5,7,8,9,剩下的必须是0-9数字
String phone = "16885885";
boolean flag2 = phone.matches("1[35789][0-9]{9}");
System.out.println(flag2);
//验证邮箱 xxx@itcast.cn xxx@sina.com.cn
String email = "jags@126.com.cn.xxx";
boolean flag3 = email.matches("\\w+@\\w+(\\.\\w+)+");
System.out.println(flag3);

}
}

2.正则有关的方法

/*
字符串正则有关的方法:
String[] split(String regex):根据正则表达式切割字符串
String replaceAll(String regex, String replacement):根据正则表达式进行替换。
参数regex:正则表达式
参数replacement:新的内容
返回值:替换后新的字符串
*/
public class Demo02String {
public static void main(String[] args) {
String str = "aa bb cc dd";
//替换,使用*替换掉str中的空格
String newStr = str.replaceAll("\\s+", "*");
System.out.println(newStr);

//根据空格切割
/*
String[] strArr = str.split("\\s+");
for (String s : strArr) {
System.out.println(s);
}
*/
}
}

总结

一. 单例模式
要求某个类的对象只创建一个
懒汉式【后创建对象】
饿汉式【先创建对象】

二. 枚举
是多例的一种体现,
枚举的本质就是类,只不过里面每一个属性都是自身的对象
格式:
public enum 枚举名 {
属性, 属性
}

三. 工厂模式
将创建对象的操作交给工厂,我们只管去通过工厂获取对象。

四. 正则表达式
能看懂即可。
作用:用来验证一个字符串是否符合规则。
[abc]:表示a或者b或者c
[^abc]:表示除了a,b,c之外的字符。
[a-z]:表示a-z中的任意一个.
[A-Z]:表示A-Z中的任意一个.
[0-9]:表示0-9中的任意一个.
[a-zA-Z0-9]:表示匹配a-z,A-Z,0-9中的任意一个字符
[a-mp-x]:表示匹配a-m,p-x中的任意一个字符

\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符: 空格 tab等等
\S 非空白字符
\w 单词字符: [a-zA-Z0-9_]
\W 非单词字符: [^a-zA-Z0-9_]


?:0次或1
*:任意次
+:一次或多次
{n}:恰巧n次
{n,}:至少n次
{n,m}:n到m次
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.YHL

谢谢您的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值