单例模式
单例模式属于创建型模式
饿汉模式:立即加载
java
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){
}
public static Singleton getInstance() {
return instance;
}
}
懒汉模式,懒加载
-
线程不安全
javapublic class Singleton { private static Singleton instance; private Singleton (){ } public static Singleton getlnstance() { if (instance == null){ instance = new Singleton(); } return instance; } }
-
线程安全
javapublic class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
-
双重锁
javapublic class Singleton { private volatile static Singleton singleton; private Singleton (){ } public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
-
静态内部类
javapublic class Singleton { private Singleton() { } //内部类在外部类调用的时候才会被初始化 // 内部类一定要在方法调用之前初始化 private static class SingletonInstance { private static final Singleton instance = new Singleton(); } // static 使单例空间共享 // final使得方法不能被重写重载 public static final Singleton getInstance() { return SingletonInstance.instance; } }
策略模式
策略模式属于行为型模式
核心思想是对算法进行封装,委派给不同对象来管理。
比如我们旅游可以选择出行的策略有:自行车、电动车、公交车等-
-
结构
策略模式饱汉三种类:
角色 关系 作用 抽象策略类strategy 是所有类的父类 定义一个公共接口,定义一些算法标识和抽象方法 具体策略concrete strategy 是抽象策略的接口实现类 实现抽象策略定义的抽象方法,描述具体法的算法实现 环境context 维护一个抽象策略类的引用实例 委托策略变量,调用具体策略所实现的抽象策略接口中的方法
工厂模式
概念
工厂模式,提供一种创建对象的方式,
在创建对象时提供一种封装机制,将实际创建对象的代码与使用代码分离
定义一个创建对象的接口,让其子类自己决定实例化哪个工厂类,工厂模式使其创建过程延迟到子类进行。
不暴露对象创建逻辑的情况下创建对象,
主要解决接口选择问题
角色
抽象产品:产品的共同接口或抽象类
具体产品:实现了抽象产品接口
抽象工厂:声明创建产品的抽象方法
具体工厂实现抽象工厂接口
分类
分为:简单工厂、方法工厂、抽象工厂
实现
- 简单工厂
java
//简单工厂:每创建一个产品就会增加一个对应的具体的工厂类
// 违背了开闭原则,不属于23种GOF
public class Test {
public static void main(String[] args) {
Baozi baozi = SimpleFactory.createBaozi("jiangrou");
System.out.println(baozi.createBaozi());
Baozi baozi1 = SimpleFactory.createBaozi("jiangrou");
System.out.println(baozi1.createBaozi());
}
}
//抽象工厂
interface Baozi {
String createBaozi();
}
//产品的具体的实现
class JiangRou implements Baozi {
@Override
public String createBaozi() {
return "酱肉";
}
}
class XianRou implements Baozi {
@Override
public String createBaozi() {
return "鲜肉";
}
}
//工厂类是关键
//判断要做什么包子,整个做包子的生产都被这个工厂类封装起来了
//用户不需要关注这里面的细节
//适合创建对象比较少的情况,只需传递具体参数,忽略生产细节
class SimpleFactory {
public static Baozi createBaozi(String type) {
switch (type) {
case "jiangrou":
return new JiangRou();
case "xianrou":
return new XianRou();
}
return null;
}
}
- 方法工厂
java
//工厂方法:定义一个用于创建产品的接口,由子类决定生产什么产品
//如果还有其他类型的包子,需要在SimpleFactory里面加判断,因为只能在那里生产包子,违反开闭原则
//是简单工厂的的抽象,抽象一个工厂接口,
//增加新产品时,需要增加新的工厂
//一个工厂只生产一种产品
public class Test {
public IPhone getPhoneGrete(String type){
if ("huawei".equals(type)){
HuaWeiPhoneFactory huaWeiPhoneFactory = new HuaWeiPhoneFactory();
IPhone phone = huaWeiPhoneFactory.createPhone();
return phone;
}
if ("xiaomi".equals(type)){
XiaomiPhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();
IPhone phone = xiaomiPhoneFactory.createPhone();
return phone;
}
return null;
}
public IPC getPcCreate(String type){
if ("huawei".equals(type)){
HuaWeiPCFactory huaWeiPCFactory = new HuaWeiPCFactory();
IPC pc = huaWeiPCFactory.createPC();
return pc;
}
if ("xiaomi".equals(type)){
XiaomiPCFactory xiaomiPCFactory = new XiaomiPCFactory();
IPC pc = xiaomiPCFactory.createPC();
return pc;
}
return null;
}
public static void main(String[] args) {
Test test = new Test();
IPC huawei = test.getPcCreate("huawei");
IPC xiaomi = test.getPcCreate("xiaomi");
IPhone xiaomi1 = test.getPhoneGrete("xiaomi");
}
}
//抽象产品
interface IPhone {
void createPhone();
}
interface IPC {
void createPC();
}
interface ISW {
void createSW();
}
//具体的产品
class HuaWeiPhone implements IPhone {
@Override
public void createPhone() {
}
}
class XiaoMiPhone implements IPhone {
@Override
public void createPhone() {
}
}
class HuaWeiPC implements IPC {
@Override
public void createPC() {
}
}
class XiaoMiPC implements IPC {
@Override
public void createPC() {
}
}
//手机工厂
interface PhoneAbstractFactory {
IPhone createPhone();
}
//电脑工厂
interface PCAbstractFactory {
IPC createPC();
}
//华为手机工厂
class HuaWeiPhoneFactory implements PhoneAbstractFactory {
@Override
public IPhone createPhone() {
return new HuaWeiPhone();
}
}
//华为电脑工厂
class HuaWeiPCFactory implements PCAbstractFactory {
@Override
public IPC createPC() {
return new HuaWeiPC();
}
}
//小米手机工厂
class XiaomiPhoneFactory implements PhoneAbstractFactory {
@Override
public IPhone createPhone() {
return new XiaoMiPhone();
}
}
//小米电脑工厂
class XiaomiPCFactory implements PCAbstractFactory {
@Override
public IPC createPC() {
return new XiaoMiPC();
}
}
- 抽象工厂
java
//一个工厂可以生产不同产品等级的产品族
public class Test {
public static void main(String[] args) {
HuaweiFactory huaweiFactory = new HuaweiFactory();
huaweiFactory.createPhone();
huaweiFactory.createPC();
XiaomiFactory xiaomiFactory = new XiaomiFactory();
xiaomiFactory.createPhone();
xiaomiFactory.createPC();
}
}
//抽象产品族
interface Phone {
void createPhone();
}
interface PC {
void createPC();
}
interface SWI {
void createSWI();
}
//具体产品族
class XiaoMiPhone implements Phone {
@Override
public void createPhone() {
System.out.println("小米手机");
}
}
class XiaoMiSWI implements SWI {
@Override
public void createSWI() {
System.out.println("小米手表");
}
}
class HuaweiPhone implements Phone {
@Override
public void createPhone() {
System.out.println("华为手机");
}
}
class XiaoPC implements PC {
@Override
public void createPC() {
System.out.println("小米电脑");
}
}
class HuaweiPC implements PC {
@Override
public void createPC() {
System.out.println("华为电脑");
}
}
//抽象工厂,一个工厂可以生产不同产品等级的产品族
abstract class AbstractFactory {
public abstract Phone createPhone();
public abstract PC createPC();
public abstract SWI ccreateSWI();
}
//具体工厂
class HuaweiFactory extends AbstractFactory {
@Override
public Phone createPhone() {
return new HuaweiPhone();
}
@Override
public PC createPC() {
return new HuaweiPC();
}
@Override
public SWI ccreateSWI() {
return null;
}
}
class XiaomiFactory extends AbstractFactory {
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}
@Override
public PC createPC() {
return new XiaoPC();
}
@Override
public SWI ccreateSWI() {
return new XiaoMiSWI();
}
}
对比
简单工厂
-
优点
- 屏蔽产品的具体实现,调用者只关心产品的接口
-
缺点
-
增加产品,需要修改工厂类,违反了开闭原则
-
工厂类集中了所有的实例的创建逻辑,违反高内聚责任分配原则
-
工厂方法
-
优点
- 继承简单工厂的优点,符合开闭原则
-
缺点
- 增加产品时,需要增加工厂类
抽象工厂
-
优点
-
不需要知道什么产品被创建
-
可以通过具体的工厂创建多个对象,增加新的具体工厂和产品族方便
-
-
缺点
- 增加新的产品等级就比较复杂,需要修改抽象工厂和所有的具体工厂类