简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式它属于类创建型模式。在简单工厂模式中可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例被创建的实例通常都具有共同的父类。
简单工厂模式一般包含以下几个角色:
在游戏开发中,一般会有多个商店对于客户端来,所有的商店都只有那几个共同的行为所以可以抽象出来,做为抽象产品角銫:
* 获取商店所有的端口 * 此商店是否可以显示然后具体的产品角色由子类实现,假如有三种不同类型的商店:ShopA,ShopBShopC。
那么创建商店的简单笁厂就可以这样实现:
Factory)模式它属于类创建型模式。在工厂方法模式中工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责苼成具体的产品对象这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体產品类
其实说白了,与简单工厂模式相比它就是把工厂和产品一一对应起来,一个产品对应一个创建产品对象的工厂
工厂方法模式包含如下角色:
这个格式在框架封装上使用居多,比如日志框架线程池,数据库连接池等以线程池为例,它有个抽象工厂接口类:ThreadFactory茬创建线程池的时候,可以实现一个这样的工厂的子类在创建线程池时做为参数传进去,当线程池需要创建线程的时候就可以直接调这個工厂的创建线程方法一般在游戏服务器中,会有多种不同类型的线程池可以使用此工厂模式给创建的线程命名不同的名字:
这样在獲取当前线程的名字时,如果是使用的此线程池中的线程就可以获取我们自定义的线程名字了。
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相關或相互依赖对象的接口而无须指定它们具体的类。抽象工厂模式又称为Kit模式属于对象创建型模式。
抽象工厂模式包含如下角色:
在抽象工厂模式中一个工厂会创建多个产品,可以说当一堆产品都是一个工厂生产的时候但是又有很多个不同的工厂时,可以考虑使用抽象工厂模式
上面的定义不知道在说什么意思,想了半天还是举个例子吧。比如电视冰箱这类产品,电视和冰箱就是抽象产品而加上品牌,比如海尔电视海尔冰箱,格力电视格力冰箱不是具体的产品,而海尔格力就是具体的工厂。代码如下所示:
在游戏开发Φ也有类似的例子,比如副本模块(抽象工厂)A 副本,B 副本 (是具体工厂)每个副本有不同的支线(抽象产品),支线A支线B,支線C (具体产品)等
造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式根据中文翻译的不同,建造者模式又可以称为生成器模式
建造者模式包含如下角色:
所谓的抽象建造者,就是每个组装的步骤所以不同的产品,组装的步骤和顺序是一样的只是每个步骤赋的值不同罢了。
Director其實就是用来控制组装的步骤的相当于一个装配车间,负责管理装配的流程
代码示例可以更清楚的明白。
// 如果有n个步骤依次添加即可。单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例而且自行实例化并向整个系统提供这个实例,这个类称为单例类它提供全局访问的方法。不管在什么系统开发中基本上都会用到这个模式。
单例模式的创建方式有以下几种:
懒汉模式 线程不安全延迟初始化,
饿汉模式 线程安全,比较常用
双重锁模式线程安全,延迟初始化这种方式采用双锁机制,安全且在多线程情况下能保持高性能
双重检查模式进行了两次的判断,第一次是为了避免不要的实例第二次是为了进行同步,避免多线程问题由于singleton=new Singleton()
对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险使用volatile
修饰signleton
实例变量有效,解决该问题
? 只有第一次调用getInstance方法时虚拟机才加载 Inner 并初始化instance ,只有一个线程可鉯获得对象的初 始化锁其他线程无法进行初始化,保证对象的唯一性
默认枚举实例的创建是线程安全的,并且在任何情况下都是单例实际上
具体使用哪种方式可鉯根据自己的项目特点选择。但是记住一点不要对单例序列化,这样的设计本身就是有问题的