一. 准备工作  

  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. jQuery中FormData的使用

    web中数据提交事件是常常发生的,但是大多数情况下我们不希望使用html中的form表单提交,因为form表单提交会中断当前浏览器的操作并且会调到另一个地址(即使这个地址是当前页面),并且会重复加载一 ...

  2. 转---移动端 h5开发相关内容总结——CSS篇

    作者:伯乐在线专栏作者 - zhiqiang21 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 meta ...

  3. Python网络练习题

    练习题 什么是C/S架构? C/S架构客户端.服务端架构,C/S端软件主要有网络游戏,QQ等 互联网协议是什么?分别介绍五层协议中每一层的功能? 互联网协议:计算机之间的通信标准 物理层:主要是基于电 ...

  4. odoo开发笔记-日期时间相关操作

    日期格式化字符串:DATE_FORMAT = "%Y-%m-%d" 日期时间格式字符串:DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" ...

  5. SqlServer 查看被锁的表和解除被锁的表

    查看被锁的表 1 2 select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName   ...

  6. android app性能优化大汇总(google官方Android性能优化典范 - 第3季)

    (1)Fun with ArrayMaps 程序内存的管理是否合理高效对应用的性能有着很大的影响,有的时候对容器的使用不当也会导致内存管理效率低下.Android为移动操作系统特意编写了一些更加高效的 ...

  7. js截取字符串的后几位数

    代码如下: var str="abcdefghhhh";//截取后4位 str.substring(str.length-4):

  8. Chapter 3 Phenomenon——24

    My mom was in hysterics, of course. 我的母亲当时是歇斯底里的发疯了. I had to tell her I felt fine at least thirty t ...

  9. Tensorflow应用之LSTM

    学习RNN时原理理解起来不难,但是用TensorFlow去实现时被它各种数据的shape弄得晕头转向.现在就结合一个情感分析的案例来了解一下LSTM的操作流程. 一.深度学习在自然语言处理中的应用 自 ...

  10. ptmalloc总结

    内存管理的一般方法 C 风格的内存管理程序主要实现 malloc()和 free()函数. 内存池是一种半内存管理方法.Apache 使用了池式内存(pooled memory),将其连接拆分为各个阶 ...