工厂模式

目录

  • 何为工厂模式
  • 工厂方法与抽象工厂
  • 如何在Java EE中通过@Producers与@Inject注解实现工厂模式
  • 如何创建自定义注解以及通过@Qualifier消除具体实现之间的歧义

    工厂模式有两种模式:工厂方法和抽象方法。它们的意图是一样的:提供一个接口,在不指定具体类的情况下创建相关或依赖的一系列对象。

一.何为工厂模式

工厂的目的在于创建对象。创建的逻辑被封装在工厂中,要么提供一个方法来返回新创建的对象(工厂方法模式),要么将对象的创建委托给子类(抽象工厂模式)。

客户端不必考虑接口或类的不同实现,它只需通过工厂(工厂)获取接口实现的一个实例的即可,这样客户端与对象的创建就实现了解耦

解耦是应用依赖反转原则的结果,这带来了很多好处,其中最重要的好处就是实现了高层类与底层类之间的解耦。通过解耦,具体类实现的变化不会影响到客户端,这降低了类与类之间的耦合,并提升了灵活性。

二.工厂方法

GoF一书是这样描述工程方法模式的:“定义一个用于创建对象的接口,不过让子类决定实例化那个类”

工厂极大降低了new关键字的使用次数,并且将初始化过程与不同的具体实现封装起来。将这些需求中心化可以极大减少向系统中添加或删除具体类的影响以及具体的类依赖的影响。

                     

1.使用普通代码实现工厂方法

被具体实现继承的DrinksMachine抽象类

public abstract class DrinksMachine {
public abstract Drink dispenseDrink();
public String displayMessage(){
return "Thank for your custom.";
}
}

DrinksMachine抽象类的CoffeeMachine实现

public class CoffeeMachine extends DrinksMachine {
public Drink dispenseDrink() {
return new Coffee();
}
}

DrinksMachine抽象类的SoftDrinksMachine实现

public class SoftDrinksMachine extends DrinksMachine {
public Drink dispenseDrink() {
return new SoftDrink();
}
}

Drink接口

public interface Drink {}

Drink接口的SoftDrink实现

public class SoftDrink implements Drink {
SoftDrink() {
System.out.println("Soft drink");
}
}

Drink接口的Coffee实现

public class Coffee implements Drink {
Coffee() {
System.out.println("Coffee");
}
}

CoffeeType枚举

public enum CoffeeType {EXPRESSO, LATTE}

public Drink dispenseDrink(CoffeeType type) {
Drink coffee = null;
switch (type) {
case EXPRESSO: coffee = new Expresso();
case LATTE: coffee = new Latte();
}
return coffee;
}

三、抽象工厂

GoF中的描述为:提供一个接口来创建一系列相关或依赖的对象而不必指定具体类



抽象工厂接口

public interface AbstractDrinksMachineFactory {
public DrinksMachine createCoffeeMachine();
public DrinksMachine createSoftDrinksMachine();
}```
AbstractDrinksMachineFactorr的实现
```java
public class GourmetDrinksMachineFactory implements AbstractDrinksMachineFactory{
public DrinksMachine createCoffeeMachine() {
return new GourmetCoffeeMachine();
} public DrinksMachine createSoftDrinksMachine() {
return new GourmetSoftDrinksMachine();
}
}

工厂模式——java设计模式的更多相关文章

  1. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  2. 软件设计模式之工厂模式(JAVA)

    什么是工厂模式? 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相 ...

  3. 设计模式之抽象工厂模式(Java实现)

    “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说完,摸了摸跪的发疼的膝盖,咳咳,我发四我没笑!真 ...

  4. 工厂模式Java

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  5. 悟空模式-java设计模式

    目前已定义的java设计模式细分下来有二十余种,这篇博客主要是想从大家所熟知的孙悟空入手,阐述各个设计模式的概念和优缺点,以及他们之间的联系. 在下面介绍的每个设计模式里,都会有与西游记相关的具体案例 ...

  6. 抽象工厂模式(JAVA反射)

    实例代码(JAVA):模式动机     在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方 ...

  7. 抽象工厂模式--java代码实现

    抽象工厂模式 抽象工厂模式,对方法工厂模式进行抽象.世界各地都有自己的水果园,我们将这些水果园抽象为一个水果园接口,在中国.英国和美国都有水果园,种植不同的水果,比如苹果.香蕉和梨等.这里将苹果进行抽 ...

  8. 简单工厂模式--java代码实现

    简单工厂模式 工厂,生产产品的场所.比如农夫山泉工厂,生产农夫山泉矿泉水.茶π等饮料.矿泉水和茶π都属于饮料,都具有解渴的功能,但是每种饮料给人的感觉是不一样的.矿泉水和茶π在Java中相当于子类,饮 ...

  9. AbstractFactoryPattern(抽象工厂模式)-----Java/.Net

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.

随机推荐

  1. ssh+注解开发 pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  2. Jmeter-连接 MySQL数据库

    一.下载mysql驱动包,mysql各个版本驱动包如下: http://central.maven.org/maven2/mysql/mysql-connector-java/ (上面链接的信息来源于 ...

  3. output.php

    <?php /** * */ class Output { function __construct() { $this->_zlib_oc = @ini_get('zlib.output ...

  4. 在mac下配置Andriod环境 包括eclipse和andriod studio

    1 前提 已经配置好了java的环境,课上要使用andriod开发. 2 步骤 2.1 eclipse 2.1.1先安装adt,adt是一个在eclipse中开发andriod的插件.由于墙,我是从其 ...

  5. Win10家庭版无法远程桌面连接的解决方法

    远程桌面连接服务器,是大家常用的一个桌面功能.在XP.Win7时代,大部分同学都是使用“盗版”操作系统,分分钟弄个“旗舰版”没有问题.可是,到了Win8.Win10时代,许多电脑都是预装的Window ...

  6. docker实用命令集合

    1. 访问docker中的MySQL数据库: docker exec -it test_mysql_1 mysql -u root -p 2. 用docker命令导入或导出mysql数据: 导出doc ...

  7. c++中的一些计算的问题

    要实现小数的四舍五入, float a = 3.456; //保留到小数点后两位 float b =(int)((a * 100) + 0.5) / 100.0; 但是这样对负数不好使, 对负数的话, ...

  8. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  9. [翻译]Elasticsearch重要文章之四:监控每个节点(jvm部分)

    http://zhaoyanblog.com/archives/753.html 操作系统和进程部分 操作系统和进程部分的含义是很清楚的,这里不会描述的很详细.他们列出了基本的资源统计,例如CPU和负 ...

  10. Swift5 语言指南(二十一) 嵌套类型

    通常创建枚举以支持特定类或结构的功能.类似地,定义纯粹在更复杂类型的上下文中使用的实用程序类和结构可能是方便的.为此,Swift允许您定义嵌套类型,从而在它们支持的类型定义中嵌套支持枚举,类和结构. ...