java 设计模式


OOP七大原则

1、单例模式

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

饿汉模式

// 饿汉式单例
public class Hungry{
	// 可能会浪费空间
	private Hungry(){}
	
	private final static Hungry HUNGRY = new Hungry();
	
	public static Hungry getInstance(){
		return HUNGRY;
	}
}

懒汉模式

// 懒汉式单例
public class LazyMan{
	
	private LazyMan(){}
	
	private volatile static LazyMan lazyMan;
	
	// 双重检测锁模式的懒汉式单例  DCL 懒汉式
	public static LazyMan getInstance(){
		if(lazyMan==null){
			synchronized (LazyMan.class){
				if(lazyMan==null){
					lazyMan = new LazyMan();
				}
			}
		}
		return lazyMan;
	}
}

静态内部类单例

// 静态内部类单例
public class Holder{
	
	private Holder(){}
	
	public static Holder getInstace(){
		return InnerClass.HOLDER;
	}
	
	public static class InnerClass{
		private static final Holder HOLDER = new Holder();
	}
}

枚举单例

// enum 本身也是一个Class类
public enum EnumSingle{
	
	INSTANCE;
	
	public EnumSingle getInstance(){
		return INSTANCE;
	}
}

2、工厂模式

作用:实现了创建者和调用者的分离

详细分类:简单工厂模式、工厂方法模式、抽象工厂模式

OOP七大原则:
开闭原则:一个软件的实体应当对扩展开放,对修改关闭
依赖倒转原则:要针对接口编程,不要针对实现编程
地米特法则:只与你直接的朋友通信,而避免和陌生人通信

简单工厂模式

public interface Car{
	void name();
}

public class WuLing implements Car{
	@Override
	public void name(){
		System.out.println("五菱宏光");
	}
}

public class Tesla implements Car{
	@Override
	public void name(){
		System.out.println("特斯拉");
	}
}

// 简单工厂,静态工厂模式
// 增加一个新的产品,如果你不修改代码,做不到
// 没有满足开闭原则
public class CarFactory{
	public static Car getCar(String car){
		if(car.equals("五菱")){
			return new WuLing();
		}else if(car.equals("特斯拉")){
			return new Tesla();
		}else{
			return null;
		}
	}
}

工厂方法模式

public interface Car{
	void name();
}

public class WuLing implements Car{
	@Override
	public void name(){
		System.out.println("五菱宏光");
	}
}

public class Tesla implements Car{
	@Override
	public void name(){
		System.out.println("特斯拉");
	}
}

// 工厂方法模式
public interface CarFactory{
	Car getCar();
}

public class WuLingFactory implements CarFactory{
	@Override
	public Car getCar(){
		return new WuLing();
	}
}

public class TeslaFactory implements CarFactory{
	@Override
	public Car getCar(){
		return new Tesla();
	}
}

根据设计原则:工厂方法模式
根据实际业务:简单工厂模式

抽象工厂模式

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类

// 手机产品接口
public interface IphoneProduct{
	void start();
	void shutdown();
	void callup();
	void sendSMS();
}
// 路由器产品接口
public interface IRouterProduct{
	void start();
	void shutdown();
	void openWifi();
	void setting();
}
// 小米手机
public class XiaomiPhone implements IphoneProduct{
	@Override
	public void start(){
		System.out.println("开启小米手机");
	}
	@Override
	public void shutdown(){
		System.out.println("关闭小米手机");
	}
	@Override
	public void callup(){
		System.out.println("小米打电话");
	}
	@Override
	public void sendSMS(){
		System.out.println("小米发短信");
	}
}
// 华为手机
public class HuaweiPhone implements IphoneProduct{
	@Override
	public void start(){
		System.out.println("开启华为手机");
	}
	@Override
	public void shutdown(){
		System.out.println("关闭华为手机");
	}
	@Override
	public void callup(){
		System.out.println("华为打电话");
	}
	@Override
	public void sendSMS(){
		System.out.println("华为发短信");
	}
}
// 小米路由器
public class XiaomiRouter implements IRouterProduct{
	@Override
	public void start(){
		System.out.println("启动小米路由器");
	}
	@Override
	public void shutdown(){
		system.out.println("关闭小米路由器");
	}
	@Override
	public void openWifi(){
		System.out.println("打开小米wifi");
	}
	@Override
	public void setting(){
		System.out.println("小米设置");
	}
}
// 华为路由器
public class HuaweiRouter implements IRouterProduct{
	@Override
	public void start(){
		System.out.println("启动华为路由器");
	}
	@Override
	public void shutdown(){
		system.out.println("关闭华为路由器");
	}
	@Override
	public void openWifi(){
		System.out.println("打开华为wifi");
	}
	@Override
	public void setting(){
		System.out.println("华为设置");
	}
}
// 抽象产品工厂
public interface IProductFactory{
	// 生产手机
	IphoneProduct iphoneProduct();
	
	// 生产路由器
	IRouterProduct routerProduct();
}
// 小米工厂
public class XiaomiFactory implements IProductFactory{
	@Override
	public IphoneProduct iphoneProduct(){
		return new XiaomiPhone();
	}
	@Override
	public IRouterProduct routerProduct(){
		return new XiaomiRouter();
	}
}
// 华为工厂
public class HuaweiFactory implements IProductFactory{
	@Override
	public IphoneProduct iphoneProduct(){
		return new HuaweiPhone();
	}
	@Override
	public IRouterProduct routerProduct(){
		return new HuaweiRouter();
	}
}
// 测试
public class Test{
	public static void main(String[] args){
		//创建小米工厂
		XiaomiFactory xiaomiFactory = new XiaomiFactory();
		IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
		iphoneProduct.callup();
		iphoneProduct.sendSMS();
		IRouteProduct iRouterProduct = xiaomiFactory.routerProduct();
		iRouterProduct.openWifi();
	}
}

优点:
具体产品在应用层的代码隔离,无需关心创建细节
将一个系列的产品统一到一起创建

缺点:
规定了所有可能被创建的产品集合,产品簇中扩展最新的产品困难
增加了系统的抽象性和理解难度