一. 准备工作  

  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. 游戏AI玩伴,是“神队友”还是“猪队友”?

    “一代英豪”暴雪迎来了自己的暴风雪. 2月13日,动视暴雪公布了2018年全年财报.财报显示,暴雪第四季度营业收入仅为28.4亿美元,低于华尔街分析师预期的30.4亿美元.在公布了财报业绩后,该公司又 ...

  2. Java内存溢出问题总结

    使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路 堆溢出 报错信息 java.lang.OutOfMemoryError: Java heap space 报错原因 堆中 ...

  3. Tools - 文本编辑器Notepad++

    00 - NotePad++ 官网 01 - Notepad++修改主题 依次点击设置---语言格式设置---选择主题,在显示界面中修改相关设置(背景色.前景色.字体等). 02 - Notepad+ ...

  4. ThinkPHP5代码执行的简单分析

    漏洞影响版本: ThinkPHP 5.0.5-5.0.22 ThinkPHP 5.1.0-5.1.30 漏洞复现: 一.mac的debug环境搭建. 一键化环境搭建工具: mamp pro ,调试工具 ...

  5. [工具]Cobalt Strike 3.13 TeamServer for Windows

    Cobalt Strike 3.13 TeamServer for Windows 0x001 环境 CS 3.12 或 3.13 Kali或Win最好安装jdk1.8.5或之后版本 设置环境变量,如 ...

  6. ajex 相关参数

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  7. hybird app混合开发介绍

    一 概念 1 Hybird App,是用现有前端(html,js,css)技术来开发的app.特点:1 灵活(开发灵活 ,部署灵活) 2 拥有类似原生的性能体验. 2 不是h5页面,也不是在webvi ...

  8. 线程中消费者生产者的实例代码(使用Lock类)

    http://www.cnblogs.com/DreamDrive/p/6192685.html 这个是用synchronized关键字实现的. Lock可以替换synchronized. 上面用来做 ...

  9. .NET平台常用框架

    分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的K ...

  10. JavaScript概念之screen/client/offset/scroll/inner/avail的width/left 分类: JavaScript HTML+CSS 2015-05-27 16:42 635人阅读 评论(0) 收藏

    原文地址:http://caibaojian.com/js-name.html JS中获取各种宽度和距离,常常让我们混淆,各种浏览器的不兼容让我们很头疼,现在就在说说js中有哪些宽度和距离. 1.名词 ...