博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂模式
阅读量:5988 次
发布时间:2019-06-20

本文共 2832 字,大约阅读时间需要 9 分钟。

hot3.png

工厂模式分为三种

简单工厂模式

需要三个角色:产品抽象类(接口)、产品具体实现类、工厂类

/** * 产品抽象接口 * Created by lidongyang on 2017/8/23 0023. */public interface Car {    void driver();}
/** * 产品具体实现类1:宝马 * Created by lidongyang on 2017/8/23 0023. */public class BMW implements Car {    public void driver() {        System.out.println("我是宝马");    }}
/** * 产品具体实现类2:奔驰 * Created by lidongyang on 2017/8/23 0023. */public class Benz implements Car {    public void driver() {        System.out.println("我是奔驰");    }}
/** * 工厂类 * Created by lidongyang on 2017/8/23 0023. */public class Factory {    public static Car create(String carType){        if ("bmw".equals(carType)){            return new BMW();        }        if("benz".equals(carType)){            return new Benz();        }        return null;    }}

下面是测试类

/** * Created by lidongyang on 2017/8/22 0022. */public class Test {    public static void main(String[] args) {        Car car = Factory.create("bmw");        car.driver();    }}

从测试类我们也可以看出,在我们需要一辆车的时候,我们并不需要关心如何去创建这个车,我们只要告诉工厂,我要宝马,那么工厂给我们的就是宝马。

优点:1、不需要关心对象的具体创建  2、符合开闭原则(对扩展开放,对修改关闭),但是这里貌似不全对,当我们如果需要一个马自达时,再加一个马自达的实现类就好了,而不需要改变其他的,这里实现了对扩展开放。但是工厂类的话,我们还是得修改,这违背了对修改关闭这部分原则。为了解决这个问题,我们有下面的一种工厂模式

工厂方法模式

有四个角色:工厂抽象类(接口)、具体工厂类、产品抽象类(接口)、具体产品类

对于产品抽象类和具体产品类,和上面一样,这里不在列代码,下面看工厂类

/** * 工厂接口 * Created by lidongyang on 2017/8/23 0023. */public interface Factory {    Car creat();}
/** * 工厂实现类1、宝马工厂 * Created by lidongyang on 2017/8/23 0023. */public class BMWFactory implements Factory{    public Car creat() {        return new BMW();    }}

下面是测试类

/** * Created by lidongyang on 2017/8/22 0022. */public class Test {    public static void main(String[] args) {        Factory factory = new BMWFactory();        Car car =  factory.creat();        car.driver();    }}

由此我们看出,当我们需要一辆车时,我们先得有一个对应车品牌的工厂,然后从工厂中拿车,这解决了简单工厂模式中不满足的“对修改关闭”的问题,假如我们再次需要马自达时,只要再加一个马自达的工厂类、马自达的产品类,就OK了。但是我们又遇到一个问题,如果有一天我们需要100种产品,难道我们要建100个工厂类吗?

抽象工厂模式

我的理解抽象工厂模式虽然一定程序上解决了上面的问题,但是它的主要目的不是解决这个问题。

抽象工厂模式,其实就是在上述的基础上,抽象工厂类(接口)中,不仅能生产小轿车,还可以生产大卡车、还可以生产吉普车等等,如下

/** * 工厂接口,生产吉普和小轿车 * Created by lidongyang on 2017/8/23 0023. */public interface Factory {    Jeep creatJeep();    Car creatCar();}
/** * 工厂实现类1,生产奔驰的品牌(奔驰厂) * eated by lidongyang on 2017/8/24 0024. */public class BenzFactory implements Factory {    public Jeep creatJeep() {        return new BenzJeep();    }    public Car creatCar() {        return new Benz();    }}
/** * 工厂实现类2、宝马工厂 * Created by lidongyang on 2017/8/23 0023. */public class BMWFactory implements Factory{    public Jeep creatJeep() {        return new BMWJeep();    }    public Car creatCar() {        return new BMW();    }}

 

综上所述,其实三种工厂模式,是层层递进的,总结一下

简单工厂:产品抽象类(接口)、具体产品类、工厂类

工厂模式:产品抽象类(接口)、具体产品类、工厂类、抽象工厂类(接口)

抽象工厂:产品抽象类(接口)、具体产品类、工厂类、抽象工厂类(接口)

其实抽象工厂就是工厂模式的一个进化。工厂模式的工厂只能生产一种产品,而抽象工厂的工厂可以生产多种产品。

 

转载于:https://my.oschina.net/u/3410701/blog/1519540

你可能感兴趣的文章
Windows去除快捷箭头
查看>>
关于分页的解决方案收集
查看>>
angularjs指令参数transclude
查看>>
GPT(保护分区)解决办法
查看>>
图像美颜篇(磨皮、锐化、美白)
查看>>
Observer模式
查看>>
写的比较规范的网站
查看>>
使用eclipse生成文档(javadoc)主要有三种方法:
查看>>
ajax提交json数据,后台解析问题
查看>>
【转】iOS开发里的Bundle是个啥玩意?!
查看>>
2016第43周四
查看>>
Qt Creator快捷键
查看>>
解读Raft(四 成员变更)
查看>>
mysql case when 判断null
查看>>
Convert enumeraltor to Dictionary object
查看>>
ios中封装网络和tableview的综合运用
查看>>
如何做好微信营销?
查看>>
Ubuntu下将python从2.7升级到3.5
查看>>
Fastboot线刷“复活”之刷机心得(三)——错误处理
查看>>
vim Google style format
查看>>