自学日记:设计模式-工厂模式

设计模式大多应用于框架级别,我们在看框架源码时,会看到各种设计模式,虽然我肯定是写不出来框架的,但是还是觉得要学一下!

故事开始:
联盟和部落脆弱的协议又扯淡了,战争一触即发,双方需要坦克,飞机,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类配合完成业务逻辑(这两个类可以不存在继承或者接口实现的关联),我们要使用工厂模式来生成对象的时候可以使用。当燃烧军团需要加入对抗虚空大军的时候,由萨格拉斯直接组织一个燃烧军团工厂就可以,便于扩展,且如果部落反出现问题就直接修改部落工厂,联盟方出现问题就直接修改联盟方!不用想简单工程模式一样修改整个工厂代码!

对于抽象工厂的理解误区,有多个类继承于同一个抽象类,为这多个类提供一个统一的工厂。抽象类的定义为不确定该类是否还有其它的属性或者方法,但是他们肯定有共同的特征(共同的属性和方法),因为它的不确定性,所以规定抽象类不能被实例化。
此处用车进行举例:车肯定是拥有行驶的方法,但是其具体表现可能是火车,汽车,自行车,婴儿车等等,他们拥有不同的轮胎数量,有些是人力的,有些是有发动机的。所以从程序逻辑上来讲,我们是不能实例化一个叫“车”的对象的,它是一个概念,因此我们把它抽象成一个抽象类。(此处和继承普通类有所不同,如果你认为可以实例化出来一个叫“车”的对象,那这里应该是父类和子类的关系)。
所以在这里我们为该抽象类的所有实现类提供统一的生产工厂。

第一次写博客,里面关于魔兽的举例也是便于自己理解,不喜勿喷。有纰漏或者理解错误的地方万望指正!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值