一篇文章带你入门java工厂模式

目录
  • 总结:

Java设计模式-工厂模式

什么是工厂模式?

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

简单编写一个类:

1、简单工厂模式

本程序非常简单就是通过接口的子类为接口对象实例化,但是本操作存在什么样的问题呢?

之前一直在强调,主方法或者是主类是一个客户端,客户端的操作应该越简单越好。但是在现在的程序之中,有一个最大的问题:客户端之中,一个接口和一个固定的子类绑在一起了。

在本程序之中,最大的问题在于耦合上,发现在主方法之中一个接口和一个子类紧密耦合在一起,这种方法比较直接,可以简单的理解为:A→B,但是这种紧密的方式不方便于维护,所以后来使用了A→B→C,中间经历了一个过渡,这样一来B去改变,C去改变,但是A不需要改变,就好比JAVA的JVM一样:程序→JVM→操作系统。

2、普通工厂模式 UML图:

源代码:

ProjectFactory.java

public interface ProjectFactory {
	Project getname();
}

BlueFactory.java(ConcreteFactory1)

public class BlueFactory implements ProjectFactory{
	@Override
	public Project getname() {
		// TODO Auto-generated method stub
		return new Bluepen();
	}
}

RedFactory.java(ConcreteFactory2)

public class RedFactory implements ProjectFactory{
	@Override
	public Project getname() {
		// TODO Auto-generated method stub
		return new redPen();
	}
}

Project.java(产品类)

public interface Project {
	void name();
}

Bluepen.java(ConcreteProject1)

public class Bluepen implements Project{
	@Override
	public void name() {
		// TODO Auto-generated method stub
		System.out.println("这是一个蓝色的笔");
	}
}

RedFactory.java(ConcreteProject2)

public class RedFactory implements ProjectFactory{
	@Override
	public Project getname() {
		// TODO Auto-generated method stub
		return new redPen();
	}
}

测试类

public class Client {
	public static void main(String[] args) {
		Project pen = new RedFactory().getname();
		pen.name();
		Project pen1 = new BlueFactory().getname();
		pen1.name();
	}
}

运行结果:

这个时候发现客户端不在和一个具体的子类耦合在一起了,就算以后增加了新的子类,那么也只需要修改Factory类即可。

小结:

  • 以后如果是自己编写的接口如果想要取得接口的 实例化对象,第一反应写工厂类
  • 简单工厂和工厂方法模式的不同在于前者生成产生产品的行为封装在一个方法中,根据参数的类型进行实例化,同时不存在抽象接口。而后者则增加了抽象工厂,通过实现不同的工厂方法来创建不同的产品,一个方法通常对应一个产品,这种方式相较于前者扩展性更高,在需求增加时完全符合开闭原则和依赖倒置原则

使用场景:

消费者不关心它所要创建对象的类(产品类)的时候。

消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候。

例如:hibernate里通过sessionFactory创建session、通过代理方式生成ws客户端时,通过工厂构建报文中格式化数据的对象。

3、抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式与工厂方法模式的区别

​ 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

​ 在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。.

如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。

UML图:

源代码:

Factory.java(抽象工厂)

public interface Factory {
	PhoneProject projectPhone();
	LaptopProject projectLaptop();
}

HuaWeiFactory.java(华为具体工厂)

public class HuaWeiFactory implements Factory{
	@Override
	public PhoneProject projectPhone() {
		// TODO Auto-generated method stub
		return new HuaWeiPhone();
	}
	@Override
	public LaptopProject projectLaptop() {
		// TODO Auto-generated method stub
		return new HuaWeiLaptop();
	}
}

XiaomiFactory.java(小米具体工厂)

public class XiaomiFactory implements Factory{
	@Override
	public PhoneProject projectPhone() {
		// TODO Auto-generated method stub
		return new XiaomiPhone();
	}
	@Override
	public LaptopProject projectLaptop() {
		// TODO Auto-generated method stub
		return new XiaomiLaptop();
	}
}

LaptopProject.java(笔记本产品)

public interface LaptopProject {
	void getId();
	void printInfo();
}

HuaWeiLaptop.java(华为笔记本)

public class HuaWeiLaptop implements LaptopProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("编号"+123);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生产了华为电脑");
	}
}

XiaomiLaptop.java(小米笔记本)

public class XiaomiLaptop implements LaptopProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("编号"+213);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生产小米电脑");
	}
}

PhoneProject.java(手机产品)

public interface PhoneProject {
	void getId();
	void printInfo();
}

HuaWeiPhone.java(华为手机)

public class HuaWeiPhone implements PhoneProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("编号:"+123412);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生产华为手机");
	}
}

XiaomiPhone.java(小米手机)

public class XiaomiPhone implements PhoneProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("编号:"+123412);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生产了小米手机!!");
	}
}

测试类:

public class Client {
	public static void main(String[] args) {
		PhoneProject huawei = new HuaWeiFactory().projectPhone();
		huawei.printInfo();
		huawei.getId();
		PhoneProject xiaomi = new XiaomiFactory().projectPhone();
		xiaomi.printInfo();
		LaptopProject huawei1 = new HuaWeiFactory().projectLaptop();
		huawei1.printInfo();
	}
}

运行结果:

总结:

抽象工厂模式是工厂方法模式的升级版,后者面向单个产品,而前者面向的的是一个产品族。根据官方定义:为创建一组相关/互相依赖的对象提供一个接口而无需指定它们的具体类。
比如一个汽车工厂要生成骑车,而每种汽车都有车门、车轮胎等一系列产品,这意味着每增加一款汽车就需要增加一个新的工厂来提供新产品的实现。这时候就可以使用抽象工厂模式来进行设计。抽象工厂模式适用于一系列产品族。

优点: 抽象厂模式将产品族的依赖与约束关系放到抽象工厂中,便于管理。职责解耦,用户不需要关心一堆自己不关心的细节,由抽象厂来负责组件的创建切换产品族容易,只需要增加一个具体工厂实现,客户端选择另-个套餐就可以了 缺点: 抽象工厂模式类增加的速度很快,有一个产品族就需要增加一一个具体工厂实现,比较繁琐产品族难以扩展产品。当产品族中增加一个产品时,抽象工厂接口中需要增加一个函数,对应的所有具体工厂实现都需要修改,修改放大严重。抽象厂并未完全屏蔽创建细节,给出的都是组件。对于这种情况可以结合工厂模式或简单工厂模式-起使用。 使用场景:

大家应该已经发现了,其实抽象工厂模式如果只有一个组件的话,其实是退化到工厂方法模式,也就是没有了产品族的概念,只剩一一个产品了,因此简单工厂,厂方法,抽象工厂这三者之间是有内在联系的,区别只产品的复杂度。抽象工厂的本质是选择产品族,因此大家可以根据这个特征来识别是否可以应用抽象厂。

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • java设计模式--三种工厂模式详解

    目录 简单工厂 代码: 1.产品接口 2.产品接口实现子类 3.简单工厂类 4.调用工厂 5.测试 工厂方法 代码: 1.工厂接口 2.工厂实现子类 3.产品接口 4.产品实现子类 5.调用 6.测试 1.产品接口 2.产品抽象子类-普通产品 抽象工厂 3.1产品抽象子类-魔法产品 4.工厂接口 5.工厂实现子类-普通工厂 6.工厂实现子类-魔法工厂 7.调用 8.测试 总结 简单工厂 简单工厂模式是属于创建型模式,是工厂模式的一种.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.定义

  • 详解Java实践之抽象工厂模式

    目录 一.前言 二.开发环境 三.抽象工厂模式介绍 四.案例场景模拟 4.1.场景模拟工程 4.2.场景简述 4.2.1.模拟单机服务 RedisUtils 4.2.2.模拟集群 EGM 4.2.3.模拟集群 IIR 4.3.单集群代码使用 4.3.1.定义使用接口 4.3.2.实现调用代码 五.代码实现 5.1.工程结构 5.2.ifelse实现需求 5.3.测试验证 六.抽象工厂模式重构代码 6.1.工程结构 6.2.代码实现 6.2.1.定义适配接口 6.2.2.实现集群使用服务 6.2.

  • 如何从Java接口的角度切入静态工厂模式

    面向接口编程 接口的定义及功能 这里从java介入吧,在java中,接口是一种特殊的类,接口里面的量都是常量,接口的方法只有定义而没有实现,换句话说,接口就像一个菜单,它只会告知你我有什么菜,而并不会有实际的菜品,所以通常用接口来定义实现类的外观,根据外部应用所需要的功能,约定实现类的能力(类的功能不仅限于接口约束).通过接口,可以实现不相关类的相同功能,而不考虑这些类之间的层次关系,接口就是实现类对外的外观. 上面那样说,可能显得很装13,那千言万语化成一句人话就是:1.定义功能,对外暴露 2

  • Java设计模式之抽象工厂模式详解

    一.什么是抽象工厂模式 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,这称之为抽象工厂模式(Abstract Factory).我们并不关心零件的具体实现,而是只关心接口(API).我们仅使用该接口(API)将零件组装称为产品. 二.示例程序   1.抽象的零件:Item类 package com.as.module.abstractfactory; /** * 抽象的零件 * @author Andy * @date 2021/4/29 23:16 */ public

  • java简单工厂模式入门

    目录 前言 试例 1. 创建饮料接口(或者抽象类) 2. 具体饮料类的实现(可乐.雪碧) 3. 饮料生产工厂类 4. 工厂调用 总结 前言 定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method) 只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程 试例 以饮料加工厂为例 1. 创建饮料接口(或者

  • 一篇文章带你入门java工厂模式

    目录 总结: Java设计模式-工厂模式 什么是工厂模式? 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 简单编写一个类: 1.简单工厂模式 本程序非常简单就是通过接口的子类为接口对象实例化,但是本操作存在什么样的问题呢? 之前一直在强调,主方法或者是主类是一个客户端,客户端的操作应该越简单

  • 一篇文章带你入门java代理模式

    目录 Java设计模式-代理模式 什么是代理模式? 代理模式 小结: 应用实例: 使用场景: 总结 Java设计模式-代理模式 什么是代理模式? 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 所谓的代理严格来讲就是两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个辅助完成主类业务逻辑操作. 代理模式 UML图: 源代码: interface ISubject

  • 一篇文章带你入门java模板模式

    目录 Java设计模式-模板模式 什么是模板模式? 总结: Java设计模式-模板模式 什么是模板模式? 模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类来定义,公共的结构化逻辑需要在抽象类中完成,只将非公共的部分逻辑抽象成抽象方法,留待子类充实实现. 下面首先通过一个简单的程序来分析一下,例如:现在有三种类型:猪.机器人.人: 猪具备三种功能:吃

  • 一篇文章带你入门java面向对象

    目录 一.继承 示例: 二.重载 三.接口 1.接口与类相似点: 2.接口与类的区别: 3.语法 四.枚举 1.定义 2.迭代枚举元素 3.在 switch 中使用枚举类 总结 一.继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为 本章就以人.学生.老师作为例子.学生和老师都继承人这个对象,都有人的特征和行为,人就是父类,老师和学生就是子类 示例: 人类: package com.zhouzy.base.t7;

  • 一篇文章带你入门Java修饰符

    目录 定义 分类 访问控制修饰符 非访问控制修饰符 修饰符的使用说明 修饰类 修饰方法 访问控制修饰符 非访问控制修饰符 修饰变量 总结 定义 Java修饰符:修饰符用来定义类.方法或者变量,通常放在语句的最前端. 分类 主要分为2类: 访问控制修饰符 非访问控制修饰符 访问控制修饰符 可以使用访问控制符来保护对类.变量.方法和构造方法的访问.分为以下4中权限:private,default,protected,public. 权限说明: 修饰符 当前类 同包 子类(不同包) 不同包(其他类)

  • 一篇文章带你入门Java字面量和常量

    目录 引言 概念 字面量 字面量的分类 常量 总结 引言 ♀ 小AD:哥,前两天我没有闪现到刺客脸上了吧 ♂ 明世隐:在这方面做的有进步. ♀ 小AD:明哥教的好,通过学习Java关键字,游戏水平也得到了提升,一举两得,舒服. ♂ 明世隐:可是你看到残血还是上头啊,是了多少次,你说? ♀ 小AD:5.6次吧 ♂ 明世隐:岂止5.6,起码10次. ♀ 小AD:这不是看到200金币,经不住诱惑吗 ♂ 明世隐:关爱残血,你学哪里去了,游戏中就不能多一些人间的关爱吗?你就不能关爱一下放暑假的小弟弟小妹妹

  • 一篇文章带你入门Java继承

    目录 Java中继承 什么是继承: 为什么要用继承: 学习总结: 继承关键字:extends 总结 Java中继承 什么是继承: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 为什么要用继承: 可以去掉重复代码,方便后期维护 举个列子,大家应该都玩过英雄联盟,每个英雄都是一个类,如果说不用继承的话每次都要重复定义每个英雄的成员属性,如下图我举了一个MF,一个EZ的列子 public class MissFortu

  • 一篇文章带你入门Java封装

    目录 什么是封装 如何实现封装 代码展示 构造方法 注意点: 代码展示 总结 封装的优点 什么是封装 Java中的封装是将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制. 在封装中,类的变量将从其他类隐藏,并且只能通过当前类的方法访问. 如何实现封装 可以分为两步: 第一步:将类的变量声明为private. 第二步:提供公共set和get方法来修改和获取变量的值. 代码展示 public class User { private String name; private in

  • 一篇文章带你入门Java基本概念

    目录 Java基本概念 一.JRE(Java运行时环境) 二.JDK(Java开发工具) 三.Java源代码文件(.class) 四.Java字节码文件(.java) 五.Java虚拟机(JVM) 六.跨平台运行 七.JDK与JRE.JVM的关系? 八.几个结论 总结 Java基本概念 JDK包含了不少Java开发相关命令.如,javac.java.javap.javaw.javadoc.虽然现在的Java开发都使用IDE完成,基本上不会直接使用这些命令.但是理解这些命令的用法,可以让我们更加扎

  • 一篇文章带你入门Java运算符

    目录 算数运算符(Arithmetic operator) 关系运算符(Relational operator) 逻辑运算符(Logical operator) 赋值运算符(Assignment Operators) 三元运算符(Ternary operator) 运算符优先级 标识符的命名规则和规范 关键字定义和特点 保留字 总结 运算符时一种特殊的符号,用以表示数据的运算,赋值和比较等. 算数运算符 赋值运算符 关系运算符 逻辑运算符 位运算符 三元运算符 算数运算符(Arithmetic

随机推荐