先说一下枚举类单例模式 也是我们最常用的 这种实现也是最佳的 防止反射 如果反射枚举类型就会报错 因为源码中通过反射获取枚举类 会被过滤掉 就是说我们不能通过反射机制去获取枚举的实例
public static enum SingletonEnum{
SINGLETON;
private Singleton singleton = null;
private SingletonEnum(){
singleton = new Singleton();
}
public Singleton getSingleton(){
return singleton;
}
}
测试一下
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
new Thread(()->{
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(SingletonEnum.SINGLETON.getSingleton());
}).start();
}
}
结果:
完全没问题嗷 分析一下 因为枚举类型的构造方法只能调用一次 所以只创建一个对象 所以这个是线程安全 也是比较常见的
介绍一下抽象工厂模式 比较简单 抽象工厂模式是一种创建型模式。本质上就是工厂模式的大集合。比如我们有两个工厂,衣服工厂和裤子工厂,抽象 工厂就将这两个工厂进行整合。我们无论是要衣服和裤子都管抽象工厂要就可以,告诉他品牌和型号就可以得到具体 的衣服裤子。
直接看代码更容易懂
定义一个手机工厂 和 路由器工厂
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:11
* @Description: 手机工厂
*/
public interface PhoneProduct {
//手机开机
void start();
//手机打电话
void callUp();
}
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:12
* @Description: 路由器工厂
*/
public interface RouterProduct {
// 开机
void start();
//打开wifi
void openWifi();
}
实现华为手机和华为路由器 小米手机和 小米路由器实现类
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:14
* @Description:
*/
public class HuaWeiPhone implements PhoneProduct{
@Override
public void start() {
System.out.println("华为手机开机");
}
@Override
public void callUp() {
System.out.println("华为手机打电话");
}
}
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:15
* @Description:
*/
public class HuaWeiRouter implements RouterProduct {
@Override
public void start() {
System.out.println("华为路由器开机");
}
@Override
public void openWifi() {
System.out.println("华为路由器打开WiFi");
}
}
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:16
* @Description:
*/
public class XiaoMiPhone implements PhoneProduct {
@Override
public void start() {
System.out.println("小米手机开机");
}
@Override
public void callUp() {
System.out.println("小米手机打电话");
}
}
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:17
* @Description:
*/
public class XiaoMiRouter implements RouterProduct{
@Override
public void start() {
System.out.println("小米路由器开机");
}
@Override
public void openWifi() {
System.out.println("小米路由器打开WiFi");
}
}
实现华为手机工厂 和小米手机工厂
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:22
* @Description:
*/
public class XiaoMiFactory implements ProductFactory {
@Override
public PhoneProduct phoneFactory() {
return new XiaoMiPhone();
}
@Override
public RouterProduct routerFactory() {
return new XiaoMiRouter();
}
}
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:21
* @Description:
*/
public class HuaWeiFactory implements ProductFactory{
@Override
public PhoneProduct phoneFactory() {
return new HuaWeiPhone();
}
@Override
public RouterProduct routerFactory() {
return new HuaWeiRouter();
}
}
实现产品工厂总接口:
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:18
* @Description:
*/
public interface ProductFactory {
PhoneProduct phoneFactory();
RouterProduct routerFactory();
}
测一下
/**
* @Auther: XiaoShe
* @DateTime: 2023/6/16 12:24
* @Description:
*/
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
System.out.println("=============华为产品===============");
ProductFactory huaweiFactory = new HuaWeiFactory();
PhoneProduct huaweiPhoneProduct = huaweiFactory.phoneFactory();
huaweiPhoneProduct.start();
huaweiPhoneProduct.callUp();
RouterProduct huaweiRouterProduct = huaweiFactory.routerFactory();
huaweiRouterProduct.start();
huaweiRouterProduct.openWifi();
System.out.println("=============小米产品===============");
ProductFactory xiaoMiFactory = new XiaoMiFactory();
PhoneProduct xiaomiPhoneProduct = xiaoMiFactory.phoneFactory();
xiaomiPhoneProduct.start();
xiaomiPhoneProduct.callUp();
RouterProduct xiaomiRouterProduct = xiaoMiFactory.routerFactory();
xiaomiRouterProduct.start();
xiaomiRouterProduct.openWifi();
}
}
结果:
感觉没问题 比较简单 学会了