设计模式大多应用于框架级别,我们在看框架源码时,会看到各种设计模式,虽然我肯定是写不出来框架的,但是还是觉得要学一下!
故事开始:
联盟和部落脆弱的协议又扯淡了,战争一触即发,双方需要坦克,飞机,AK47,M4A1,东风快递等各种重火力。。。。乌瑞恩国王开始为战略物资发愁,于是指示希尔瓦娜斯筹措物资。。。希尔瓦娜斯于是开始new各种各样的武器出来,但是战争一打就是4年,new的黑眼圈都出来了(这也为后来希女王把天捅破埋下了伏笔。。。),然后麦迪文从黑暗之门得到启示,我们搞个“工厂”吧!
1、工厂模式(工厂直接生成装备,你们就不用自己来new了!你要哪个我就给哪个?但是是我必须有的,没有的你问我要什么?风剑和凤凰都有的!!)
为什么要使用工厂模式?(工厂模式的好处)
欢迎补充,自己也在总结中!
工厂模式的三种实现方法
简单工厂模式(针对于应用场景较简单,例如你要灰烬使者,我就生成灰烬使者,你要橙锤就给橙锤,只负责生成极品装备的时候)
//装备抽象类
public abstract class Bean {
//品质
//价格
//武器是否发亮
}
//工厂类
public class BeanFactory {
public static Bean createProduct(@NotNull String type){
Bean bean=null;
if(!type.equals("")){
if(type.equals("我要蛋刀")){
bean=new XFLBean();
}else if (type.equals("我要AK47")){
bean=new BKBean();
}
}
return bean;
}
}
//蛋刀
public class XFLBean extends Bean{
private String beanName;
public XFLBean() {
System.out.println("双蛋刀齐活");
}
}
//AK47
public class AKBean extends Bean{
private String beanName;
public AKBean() {
System.out.println("AK47来了");
}
}
问题来了
1、如果这个工厂要增加一种其它的武器怎么办?我的霜之哀伤还没有凑齐了?这种方式就需要在工厂生成方法中中一一对应添加,已经提交了的代码,再去修改,风险太高
2、在高并发情况中,我要生成一个武器对象,要经过诸多if else判断,效率太低
然后麦迪文又开始瞎搞了!!
2、工厂方法模式:实现逻辑,为每个武器单独提供生成的工厂(然后各种武器就烂大街了),但是打仗嘛,总的付出代价!
工厂方法模式(为了解决上面简单工厂模型带来的弊端,为每一种装备都提供一个工厂分开生产)
//创建工厂接口
public interface BeanFactory {
public Bean createProduct();
}
//东方快递的工厂实现类
public class DFBeanFactory implements BeanFactory {
public Bean createProduct() {
return new AKBean ();
}
}
//AK47的工厂实现类
public class XFLBeanFactory implements BeanFactory {
public Bean createProduct() {
return new XFLBean();
}
public static void main(String[] args) {
BeanFactory beanFactory=new XFLBeanFactory();//此处可以通过配置文件的方式传递参数,类似spring的bean注入
beanFactory.createProduct();
}
}
果然这样子提高了效率,如果需要添加装备,我们只需要创建装备类,然后再去创建一个装备工厂类,要多少有多少!
抽象工厂模式
燃烧军团入侵了,已经到了不得不动用大规模作战的时候,这个时候就类似于要组建多个团队出征,然而团队是需要讲配置的,比如一个小队里面,要1个tank,1个奶妈,1个盗贼,1个法师,还需要一个J20战斗机!!!这是单独作战已经失去了意义,联盟和部落必须团结一致,且以一个小队一个小队的形式进行打副本,对工厂的要求也变成了一个工厂要配置成为可以生产要tank,奶妈,盗贼,法师,J20战斗机的要求。这里以坦克和J20战斗机举例:
//要生产T,也要生产飞机
public interface Factory {
//生产坦克
public Car createCar();
//生产飞机
public Plane createPlane();
}
//坦克抽象类
public abstract class Car {
}
//飞机的抽象类
public abstract class Plane {
}
public class ArmorCar extends Car{
public ArmorCar(){
System.out.println("联盟装甲车");
}
public void run() {
}
}
public class TankCar extends Car{
public TankCar(){
System.out.println("部落坦克");
}
public void run() {
}
}
public class J20Plane extends Plane{
public J20Plane() {
System.out.println("部落J20战斗机");
}
}
public class YUN20Plane extends Plane{
public YUN20Plane() {
System.out.println("联盟胖妞");
}
}
//部落兵工厂
public class AFactory implements Factory{
public Car createCar() {
return new TankCar();
}
public Plane createPlane() {
return new J20Plane();
}
}
//联盟兵工厂
public class BFactory implements Factory{
public Car createCar() {
return new ArmorCar();
}
public Plane createPlane() {
return new YUN20Plane();
}
}
public class Client {
public static void main(String[] args) {
Factory factory=new AFactory();
factory.createCar();//部落生产了自己的部落坦克
}
}
从代码层面的理解,如果A类引用了其它的2个以上的类,B类,C类,从业务需求上需要B、C类配合完成业务逻辑(这两个类可以不存在继承或者接口实现的关联),我们要使用工厂模式来生成对象的时候可以使用。当燃烧军团需要加入对抗虚空大军的时候,由萨格拉斯直接组织一个燃烧军团工厂就可以,便于扩展,且如果部落反出现问题就直接修改部落工厂,联盟方出现问题就直接修改联盟方!不用想简单工程模式一样修改整个工厂代码!
对于抽象工厂的理解误区,有多个类继承于同一个抽象类,为这多个类提供一个统一的工厂。抽象类的定义为不确定该类是否还有其它的属性或者方法,但是他们肯定有共同的特征(共同的属性和方法),因为它的不确定性,所以规定抽象类不能被实例化。
此处用车进行举例:车肯定是拥有行驶的方法,但是其具体表现可能是火车,汽车,自行车,婴儿车等等,他们拥有不同的轮胎数量,有些是人力的,有些是有发动机的。所以从程序逻辑上来讲,我们是不能实例化一个叫“车”的对象的,它是一个概念,因此我们把它抽象成一个抽象类。(此处和继承普通类有所不同,如果你认为可以实例化出来一个叫“车”的对象,那这里应该是父类和子类的关系)。
所以在这里我们为该抽象类的所有实现类提供统一的生产工厂。
第一次写博客,里面关于魔兽的举例也是便于自己理解,不喜勿喷。有纰漏或者理解错误的地方万望指正!!