一. 准备工作  

  1. 本文参考自  自己理解的工厂模式,希望对大家有所帮助

二. 开始  

  以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和奔驰车的类 Benz 实现了 Car 接口。

public interface Car{
public void drive();
} public class BMW implements Car{
public BMW(){
System.out.println("生产一台宝马车");
} public void drive(){
System.out.println("我开宝马车");
}
} public class Benz implements Car{
public Benz(){
System.out.println("生产一台奔驰车");
} public void drive(){
System.out.println("我开奔驰车");
}
}

   

    现在如果要用 BMW 这个类,最基本的方法是:BMW bmw = new BMW();  如果还要个 Benz 类,就得:new Benz();这样每个都得 new 个汽车对象,但是宝马和奔驰都属于汽车,都有 drive() 方法;那我们是不是能创建一个生产汽车的工厂,然后想要什么汽车告诉工厂,工厂帮你生产就可以了,而不用管生产的细节(也就是 new 对象的过程),这样会更好呢?到此,简单工厂模式就出来了。

三. 简单工厂模式

public class CarFactory{
public static Car createCar(String carName){
if("BMW".equals(carName)){
return new BMW();
}else if("Benz".equals(carName)){
return new Benz();
}
}
}
    如果要生产一台汽车,直接调用Car car = CarFactory.createCar("BMW"); 就可以了。
这种工厂虽然挺好,但是每次要加入新车都得修改工厂类来加入新的判断语句,不符合开闭原则;所以又有了一种更好的生产方式,这就是工厂方法模式。

四. 工厂方法模式

  首先抽象出一个生产汽车的工厂类接口,然后让具体工厂类实现这个接口,这样就有宝马车生产工厂、奔驰车生产工厂。

public interface CarFactory{
public static Car createCar();
} public class BMWFactory implements CarFactory{
public static Car createCar(){
return new BMW();
}
} public class BenzFactory implements CarFactory{
public static Car createCar(){
return new Benz();
}
}

  这样的好处就是如果我还要生产长城汽车,不用去修改 CarFactory 工厂,只要写个长城工厂类去实现CarFactory接口就可以了。

    随着社会的进步,汽车种类也多了,比如分为越野车和跑车两个系列,这样原来 Car 接口就不能通用,而变成 YueYeChe 和 PaoChe 两个接口,而越野车适合在山上跑,跑车适合在赛路上跑,drive 的方法也改变了,如下:
public interface YueYeChe{
public void driveShanLu();
} public interface PaoChe{
public void driveSaiLu();
}

  而宝马和奔驰都生产跑车和越野车:

public BMWYueYeChe implements YueYeChe{
public void driveYueYeChe(){
System.out.println("我在山路上开宝马越野车");
}
} public BMWPaoChe implements PaoChe{
public void drivePaoChe(){
System.out.println("我在赛路上开宝马跑车");
}
} public BenzYueYeChe implements YueYeChe{
public void driveYueYeChe(){
System.out.println("我在山路上开奔驰越野车");
}
} public BenzPaoChe implements PaoChe{
public void drivePaoChe(){
System.out.println("我在赛路上开奔驰跑车");
}
}
    按照工厂方法模式,我们需要 YueYeCheFactory 和 PaoCheFactory 两个工厂接口,以及 BMWYueYeCheFactory 、BMWPaoCheFactory、BenzYueYeCheFactory 、BenzPaoCheFactory 四个具体工厂类。如果需要再生产其他车,工厂类会呈指数增长,难以维护。如果能对工厂接口进行扩充,不是更好?这样就产生了抽象工厂模式。

五. 抽象工厂模式

    工厂方法模式一般是针对一种系列的抽象产品的生产,为变成可以对多种系列的产品进行生产,而把工厂方法模式进行扩充,这就是抽象工厂模式。因为 Car 类分成了跑车和越野车,所以扩充后的工厂接口也就能生产出跑车和越野车。这样,宝马工厂类可以生产宝马跑车和宝马越野车,奔驰工厂类可以生产奔驰跑车和奔驰越野车。
public interface CarFactory{
public static PaoChe createPaoChe();
public static YueYeChe createYueYeChe();
} public BMWFactory implements CarFactory{
public static PaoChe createPaoChe(){
return new BMWPaoChe();
} public static YueYeChe createYueYeChe(){
return new BMWYueYeChe();
}
} public BenzFactory implements CarFactory{
public static PaoChe createPaoChe(){
return new BenzPaoChe();
} public static YueYeChe createYueYeChe(){
return new BenzYueYeChe();
}
}

Java开发中常用的设计模式(一)---工厂模式的更多相关文章

  1. Java开发中常用的设计模式(三)---建造者模式

    一. 模式结构 建造者模式主要包含四个角色: Product:产品角色. Builder:抽象建造者.它声明为创建一个Product对象的各个部件指定的抽象接口. ConcreteBuilder:具体 ...

  2. Java开发中常用的设计模式(二)---单例模式

    一. 懒汉式单例 //懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { private Singleton() {} private static Sing ...

  3. Java开发中常用jar包整理及使用

    本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...

  4. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  5. iOS开发中常用的设计模式

    常用的设计模式(一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过 ...

  6. Android开发中常用的设计模式

    首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...

  7. Java 开发中常用的网站地址

    博客地址:http://www.moonxy.com 一.前言 在日常的开发中,通常需要访问或者设置不同的网站来获取需要的数据,不如我们都知道 Linux 系统版本比较多(例如:Ubuntu.Cent ...

  8. ios项目总结一:开发中常用的设计模式

    一.单例设计模式 1.应用场景: 程序运行期间,在内存中只有一个实例存在,主要用于资源共享,对硬件的访问等等 2.优点: 跨模块,解耦合,使用简单 3.敏捷原则: 单一职责原则 4.SDK实例: UI ...

  9. JAVA开发的23种设计模式之 --- 桥接模式

    桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多 ...

随机推荐

  1. ArrayBlockingQueue源码解析(2)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3.3.public void put(E e) throws InterruptedException 原 ...

  2. [leetcode.com]算法题目 - Jump Game

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  3. [leetcode.com]算法题目 - Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  4. idea使用Protobuf插件

    1.protobuf简介 Protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.Protobuf是跨语言的,并且自带了一个编译器(p ...

  5. AJPFX技术分析入门

    AJPFX:技术分析入门 技术分析就是指通过考察历史数据来预测未来价格走向.外汇市场是非常讲技术分析的,而且分析师的基本功就是技术分析,但是,没有对基本面的准确把握,技术分析就会含糊.但是技术分析究其 ...

  6. 常用下载方式的区别-BT下载、磁力链接、电驴

    出处:https://www.jianshu.com/p/72b7a64e5be1 打开 115 离线下载的窗口,看到支持这么多种链接,你都清楚他们是什么原理嘛?接下来我们一个一个说. 一.HTTP( ...

  7. file_put_contents 换行

    file_put_contents('test.text', json_encode($result) . PHP_EOL, FILE_APPEND);

  8. OC中双向链表的实现

    双向链表的概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都 ...

  9. SubLime Text 3 配置SublimeREPL来交互式调试程序

    1. 安装 SublimeREPL 插件 等待一下,输入sublimerepl,选择sublimeREPL,然后它就会在后台安装. 安装完之后,查看如下图 选择你要执行的*.py文件,通过这个路径,选 ...

  10. Angular使用总结 --- 搜索场景中使用rxjs的操作符

    在有input输入框的搜索/过滤业务中,总会考虑如何减少发起请求频率,尽量使每次的请求都是有效的.节流和防抖是比较常见的做法,这类函数的实现方式也不难,不过终归还是需要自己封装.rxjs提供了各种操作 ...