一、简单工厂模式

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

实现汽车接口

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. hbase 预分区与自动分区

    我们知道,HBASE在创建表的时候,会自动为表分配一个Region,当一个Region过大达到默认的阈值时(默认10GB大小),HBase中该Region将会进行split,分裂为2个Region,以 ...

  2. Structs2 中拦截器获取请求参数

    前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...

  3. 基于nginx搭建yum源服务器

      1.首先关闭防护墙或者设置规则通过且关闭selinux 停止firewall systemctl stop firewalld 禁止firewall开机启动 systemctl disable f ...

  4. 任意N个不同数的逆序对平均值

    在学习数据结构的时候看到了以下定理: 但是老师并没有解释,本着钻研的精神决定搞清楚为什么是这个数. 在百度 google一番之后并没有找到,决定自己试着证明. 最开始走了一些弯路,但突然灵光一闪很容易 ...

  5. toast提示信息获取

    toast获取的前提条件 1.desired_caps["automationName"]="UiAutomator2"2.要求安装jdk1.8 64位及以上. ...

  6. ReSharper2018破解详细方法

    下载地址: 主程序官网下载链接:https://download.jetbrains.com/resharper/ReSharperUltimate.2018.3.3/JetBrains.ReShar ...

  7. C# web项目利用docx文档作为模板~为打印专做的解决方案

    还是那句话:十年河东,十年河西,莫欺少年穷. 目前,web端打印技术有很多,有收费的专业web打印控件,大家可以参考我的上一篇博客.当然,很多公司不愿意出钱,那么今天咱们就探讨下怎么做免费的打印. w ...

  8. FineUIMvc的分部视图连接器 --VS-- FineUIPro的用户控件连接器

    [FineUIPro]用户控件 在FineUIPro中,我们可以将公用的部分定义为一个用户控件,然后添加到页面中. 一个简单的示例:http://pro.fineui.com/#/usercontro ...

  9. JSP页面、EL表达式

    JSP页面: jsp 是一种动态页面,html 页面和 jsp页面最大的区别是:html 是一种静态页面,在 html 中只 能定义 css.js 等,在 jsp 中除了可以定义 css.js 之外还 ...

  10. 使用队列实现栈(1)(Java)

    class MyStack { private Queue q1; private Queue q2; public MyStack(int size) { this.q1 = new Queue(s ...