Java工厂模式的使用细则介绍
作者:绿仔牛奶_ 发布时间:2022-03-18 01:57:22
工厂模式
工厂模式顾名思义就是生产实例的工厂,使用工厂模式不会在程序中使用new关键字创建实例。而是将创建对象的细节隐藏,对外提供统一的方法,外部通过该方法获取实例。以此降低调用者与程序之间的耦合性,更加灵活
工厂模式可以分为三类
简单工厂模式
工厂方法模式
抽象工厂模式
简单工厂模式
定义一个接口,将创建对象和其本身的业务分离解耦,如下示例:
public interface Pet {
void shout();
}
public class Cat implements Pet{
public void shout() {
System.out.println("猫叫");
}
}
public class Dog implements Pet{
public void shout() {
System.out.println("狗叫");
}
}
// 宠物工厂
public class PetFactory {
// 方式一
public static Pet getPet(String pet) {
if (pet.equals("小猫")) {
return new Cat();
} else if (pet.equals("小狗")) {
return new Dog();
} else {
return null;
}
}
// 方式二
public static Pet getCat(){
return new Cat();
}
public static Pet getDog(){
return new Dog();
}
}
// 用户类
public class Customer {
public static void main(String[] args) {
Pet pet = PetFactory.getPet("小猫");
pet.shout();
}
}
// 输出 : 猫叫
如上述代码所示,创建对象只需要直接调用PetFactory工厂的创建方法即可,根据用户需求来创建指定对象,执行对应方法
工厂方法模式
工厂方法模式相对于简单工厂,提高了拓展性,可以在不影响原有类的情况下实现横向扩展其他类,但是代码量加大,可能会产生更多的代码冗余。
我们针对每一个类都为其设置单独的工厂,即每个工厂只生产一种类型,如果在需要新增其他类型那么只需要创建其工厂提供获取实例方法即可
public interface Pet {
void shout();
}
public class Cat implements Pet {
public void shout() {
System.out.println("猫叫");
}
}
public class CatFactory {
public static Pet getCat(){
return new Cat();
}
}
public class Customer {
public static void main(String[] args) {
Pet cat = CatFactory.getCat();
cat.shout();
}
}
使用工厂方法模式可以再不修改原有代码的基础上继续扩展,但是工作量较大
对比简单工厂和工厂方法模式:就代码和结构的复杂度,使用简单工厂模式更加简便,但是对于可拓展性则工厂方法模式更加优越
抽象工厂模式
抽象工厂用于常见一系列相关对象的家族,抽象的意思是,我们会定义一个工厂接口并且不做任何实现,只用来约束它的实现工厂生产产品的规范。
四大核心:抽象工厂、具体工厂、抽象产品、具体产品
以华为、小米生产手机和电视为例:
代码如下:
// 工厂接口
public interface ProductFactory {
RouterProduct getRouter(); // 生产路由器
PhoneProduct getPhone(); // 生产手机
}
// 手机、路由器接口
public interface PhoneProduct { void close();}
public interface RouterProduct {void start();}
// 工厂
public class HuaweiFactory implements ProductFactory{
public RouterProduct getRouter() {return new HuaweiRouter();}
public PhoneProduct getPhone() {
return new HuaweiPhone();
}
}
public class XiaoMiFactory implements ProductFactory{
public RouterProduct getRouter() {
return new XiaoMiRouter();
}
public PhoneProduct getPhone() {
return new XiaoMiPhone();
}
}
// 测试
public static void main(String[] args) {
// 拿到工厂对象
XiaoMiFactory miFactory = new XiaoMiFactory();
HuaweiFactory huaweiFactory = new HuaweiFactory();
// 小米工厂生产
PhoneProduct miFactoryPhone = miFactory.getPhone();
miFactoryPhone.close();
RouterProduct router = miFactory.getRouter();
router.start();
// 华为工厂生产
PhoneProduct phone = huaweiFactory.getPhone();
phone.close();
RouterProduct router1 = huaweiFactory.getRouter();
router1.start();
}
还有其他的产品接口实现类,华为手机、小米手机、华为路由器等等
同样的抽象工厂模式也可以进行扩展但是比较繁琐,需要再顶级工厂也就是工厂接口中去扩展,但是扩展之后其所有的实现类也都需要完成实现。如果是长期稳定状态下可以这样扩展,但是经常改动的话抽象工厂模式就显得非常鸡肋
来源:https://blog.csdn.net/yuqu1028/article/details/129005977


猜你喜欢
- 前言:众所周知,大家在很多项目中都会使用到图表,具体表现形式为饼图、折线图、柱状图等,但是网上有很多图表架包都是需要收费的,而Google的
- 本文章牵涉到的技术点比较多:spring Data JPA、Redis、Spring MVC,Spirng Cache,所以在看这篇文章的时
- 还记得读大学时初识计算机编程时的C语言,Main(){},那时还不明白入口函数是什么意思,只知道照抄书本上的示例,一行一行地跑printf看
- 本文内容大多基于官方文档和网上前辈经验总结,经过个人实践加以整理积累,仅供参考。1、日期时间字符串转换成毫秒@Testpublic void
- Apache的POI项目可以用来处理MS Office文档,codeplex上还有一个它的.net版本。POI项目可创建和维护操作各种基于O
- 后端接收form-data创建实体类public class Para_list //实体类 { &n
- 配置两个parent的方法在向pom.xml 文件中添加依赖之前需要先添加spring-boot-starter-parent。spring
- 本文实例讲述了C#实现软件监控外部程序运行状态的方法。分享给大家供大家参考。具体方法如下:需要 * 一个程序,用于监控另一个程序运行状态,一旦
- 本文实例讲述了Android编程开发之在Canvas中利用Path绘制基本图形的方法。分享给大家供大家参考,具体如下:在Android中绘制
- 本文实例讲述了C#实现查杀本地与远程进程的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.
- Windows系统启动Java程序会弹出黑窗口。黑窗口有几点不好。首先它不美观;其次容易误点导致程序关闭;但最让我匪夷所思的是:将鼠标光标选
- NoHttp是专门做Android网络请求与下载的框架,NoHttp基本使用方法如下本文demo源码下载地址: http://xiazai.
- 这篇文章主要介绍了SpringBoot下如何实现支付宝接口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 目录一、首先模型本身需要特殊处理二、编写Shader三、讲解先上图看看效果:下面详细分享一下制作步骤吧:一、首先模型本身需要特殊处理二、编写
- 一般查询手机归属地内容应该很好用json格式保存,在网上找到了淘宝的归属地API,并下了处理json相关的jar包,做了这个手机归属地查询功
- BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存
- 本文实例讲述了C#画笔使用复合数组绘制单个矩形的方法。分享给大家供大家参考。具体实现方法如下:using System;using Syst
- 一、前期工作1.开启邮箱服务开启邮箱的POP3/SMTP服务(这里以qq邮箱为例,网易等都是一样的)2.导入依赖在springboot项目中
- 前言大家都知道在Java中,除了8种基本数据类型外,其他的都是引用类型。使用引用类型是为了更好地贯彻面向对象的思想,那为什么还要保留8种基本
- 下面通过代码看下springboot 跨域配置类,代码如下所示:ackage org.fh.config;import java.io.IO