一、简单工厂模式

简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类

实现汽车接口

public interface Car {
String getName();
}

奔驰类

public class Benz implements Car {
@Override
public String getName() {
return "Benz";
}
}

宝马类

public class BMW implements Car {
@Override
public String getName() {
return "BMW";
}
}

简单工厂,既能生产宝马又能生产奔驰

public class SimpleFactory {
public Car getCar(String name){
if (name.equals("BMW")){
return new BMW();
}else if (name.equals("benz")){
return new Benz();
}else {
System.out.println("不好意思,这个品牌的汽车生产不了");
return null;
}
}
}

测试类

public class SimpleFactoryTest {
public static void main(String[] args){
SimpleFactory simpleFactory = new SimpleFactory();
Car car = simpleFactory.getCar("BMW");
System.out.println(car.getName());
}
}

测试结果

BMW

根据简单工厂的定义,用户只要产品而不在乎产品如何生产,看起来好像很完美的样子。但大家想想,这个世界存在什么都生产的工厂吗?

显然是不存在的,每一个汽车品牌都有自己的生产工厂,都有自己生产技术。映射到spring框架中,我们有很多很多种的bean需要生产,如果只依靠一个简单工厂来实现,那么我们得在工厂类中嵌套多少个if..else if啊?

而且我们在代码中生产一辆汽车只是new一下就出来了,但实际操作中却不知道需要进行多少操作,加载、注册等操作都将体现在工厂类中,那么这个类就会变得紊乱,管理起来也很不方便,所以说每个品牌应该有自己的生产类。

因为专一,所以专业嘛,这个时候工厂方法就出现了。

二、工厂方法

工厂接口

//定义一个工厂接口,功能就是生产汽车
public interface Factory {
Car getCar();
}

奔驰工厂

public class BenzFactory implements Factory {
@Override
public Car getCar() {
return new Benz();
}
}

宝马工厂

public class BMWFactory implements Factory{
@Override
public Car getCar() {
return new BMW();
}
}

测试类

public class FactoryTest {
public static void main(String[] args){
Factory bmwFactory = new BMWFactory();
System.out.println(bmwFactory.getCar().getName());
Factory benzFactory = new BenzFactory();
System.out.println(benzFactory.getCar().getName());
}
}

测试结果

BMW
Benz

根据上述代码可以看出,不同品牌的汽车是由不同的工厂生产的,貌似又是很完美的。但大家看一下测试类,当一个人想要去买一辆宝马汽车的时候(假设没有销售商),那么他就要去找宝马工厂给他生产一辆,过几天又想要买一辆奔驰汽车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性。所以有没有一种方便用户操作的方法呢?这个时候抽象工厂模式就出现了。

三、抽象工厂

 抽象工厂

public abstract class AbstractFactory {

     protected abstract Car getCar();

     //这段代码就是动态配置的功能
//固定模式的委派
public Car getCar(String name){
if("BMW".equalsIgnoreCase(name)){
return new BmwFactory().getCar();
}else if("Benz".equalsIgnoreCase(name)){
return new BenzFactory().getCar();
}else if("Audi".equalsIgnoreCase(name)){
return new AudiFactory().getCar();
}else{
System.out.println("这个产品产不出来");
return null;
}
}
}

默认工厂

public class DefaultFactory extends AbstractFactory {

    private AudiFactory defaultFactory = new AudiFactory();

    public Car getCar() {
return defaultFactory.getCar();
} }

宝马工厂

public class BMWFactory extends AbstractFactory {
@Override
public Car getCar() {
return new BMW();
}
}

奔驰工厂

public class BenzFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Benz();
}
}

 测试类

public class AbstractFactoryTest {
public static void main(String[] args) {
DefaultFactory factory = new DefaultFactory();
System.out.println(factory.getCar("Benz").getName());
}
}

测试结果

Benz

根据上述代码可以看出,用户需要一辆汽车,只需要去找默认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的生产工厂,方便用户操作。

注:对于设计模式,有些人嗤之以鼻,有些人敬若神明,但我是认可的。

按我粗浅的理解,设计模式的经典之处,就在于解决了编写代码的人和调用代码的人双方的痛楚,不同的设计模式也只适用于不同的场景。至于用或者不用,如何使用,那就需要各位看官着重考虑了。

但为了使用而使用是不应该的,细微之处,只有留给大家慢慢品味了。

深入理解Java的三种工厂模式的更多相关文章

  1. 理解java的三种代理模式

    代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...

  2. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  3. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  4. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  5. Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...

  6. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  7. Java的三种代理模式&完整源码分析

    Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.c ...

  8. Java的三种代理模式

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  9. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

随机推荐

  1. ASP.NET Zero--单元测试

    单元测试 ASP.NET Zero启动项目包含单元和集成测试.使用以下工具开发测试: xUnit作为测试框架. Shouldly 作为断言库. Microsoft.EntityFrameworkCor ...

  2. winserver-查看登陆日志

    Abstract 先要开启登陆审核,在查看登陆日志. 开启审核 运行 secpol.msc 日志查看 windowslog 下的security 管理员成功登陆后的eventid:4776,4648, ...

  3. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  4. LeetCode算法题-Shortest Completing Word(Java实现)

    这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...

  5. 2019十二省联考 Round 1 && 济南市市中心游记

    在这样一场毒瘤的省选中 这道题目无疑是命题人无私的馈赠 大量精心构造的部分分,涵盖了题目中所有涉及的算法 你可以利用这道题目,对你是否能够进入省队进行初步检查 经典的模型.较低的难度和不大的代码量,能 ...

  6. [题解] P2513 [HAOI2009]逆序对数列

    动态规划,卡常数 题目地址 设\(F[X][Y]\)代表长度为\(X\)的序列,存在\(Y\)组逆序对的方案数量. 考虑\(F[X][i]\)向\(F[X+1][i]\)转移: 把数字\(X+1\)添 ...

  7. 多态练习题(通过UML建模语言来实现饲养员喂养动物)

    项目需求如下图: package com.Summer_0428.cn; /** * @author Summer * 1.构建一个食物抽象类,Bone和Fish分别为其实现类,通过super传参. ...

  8. BAT面试题:使用数组实现一个简单的阻塞队列

    这道题是我亲身经历的一道大厂面试题,非常值得分享! 这道题可以分为两个步骤进行编码解答,第一步是基于数组实现一个队列,第二步是实现线程阻塞. 如果是基于数组实现栈的数据结构,那么我们只需要一个指针进行 ...

  9. 原生sql整理

    mysql -uroot -p #登录mysql命令password: #输入密码 mysql> #每条mysql命令后面都要加分号结尾show databases; #打印整个mysql数据库 ...

  10. MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集

    MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...