Java中常用的设计模式之工厂模式详解
作者:Asurplus、 发布时间:2021-07-04 15:33:37
标签:Java,设计模式,工厂模式
优点
1.一个调用者想创建一个对象,只要知道其名称就可以了。
2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3.屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景
1.日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2.数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3.设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。
一、实现方式
例如:我们需要在电商平台购买一台手机,我们并不需要去关心手机生产厂商是如何把手机生产出来的,我们只需要在搜索框输入:华为手机,小米手机,就能购买到我们想要的手机了。下面看看具体实现吧。
1、定义一个接口
package com.asurplus.common.factory;
public interface Phone {
/**
* 获取手机
*
* @return
*/
String getPhone();
}
2、定义两个接口实现类
package com.asurplus.common.factory;
/**
* 华为手机实现类
*/
public class HuaweiPhone implements Phone {
@Override
public String getPhone() {
return "华为手机";
}
}
package com.asurplus.common.factory;
/**
* 小米手机实现类
*/
public class XiaomiPhone implements Phone {
@Override
public String getPhone() {
return "小米手机";
}
}
3、定义一个工厂类
package com.asurplus.common.factory;
/**
* 手机工厂类
*/
public class PhoneFactory {
/**
* 获取手机
*
* @param name
* @return
*/
public static Phone getPhone(String name) {
if ("华为".equals(name)) {
return new HuaweiPhone();
}
if ("小米".equals(name)) {
return new XiaomiPhone();
}
return null;
}
}
二、测试
package com.asurplus.common.factory;
/**
* 工厂模式
*/
public class TestMain {
public static void main(String[] args) {
// 获取手机
Phone huaweiPhone = PhoneFactory.getPhone("华为");
System.out.println(huaweiPhone.getPhone());
}
}
输出结果
我们输入的:华为,得到了华为手机,从而实现了我们的工厂模式。
来源:https://lizhou.blog.csdn.net/article/details/123148971


猜你喜欢
- Mybatis Criteria条件查询CriterionCriterion是最基本,最底层的Where条件,用于字段级的筛选。Criter
- 1、接口:接口与抽象类一样,也是表示某种规则,一旦使用了该规则,就必须实现相关的方法。对于C#语言而言,由于只能继承自一个父类,因此若有多个
- 1、JavaBean介绍 * JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)
- 在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进
- 最近用了Stream流,感觉超好用,记录一下。1、快速创建List比如我有个实体类User,User有个属性Namepublic class
- 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用 Java
- 先给大家展示下效果图,感觉不错请参考实例代码。实现思路在flutter中,如果想实现上面的页面切换效果,必然会想到pageView。page
- 在做2048这个游戏时,因为菜单页面还能查看游戏规则,而这些规则又不在同一个页上,所以需要滑动页面实现页面切换,但是仅仅使用unity提供的
- #include <algorithm>class TestClass{public: int Sub(int x,
- 本节,我们从Rxjava使用代码入手,去结合自己已有的知识体系,加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。为了本文
- 本文实例讲述了C#手工双缓冲技术。分享给大家供大家参考。具体如下:using System;using System.Collections
- 使用第三方的vitamio插件实现简易的播放器。vitamio版本(5.2.3)官网地址:官网地址效果展示效果项目结构代码:MainActi
- 在Spring Cloud 的Feign组件中并不支持文件的传输,会出现这样的错误提示:feign.codec.EncodeExceptio
- 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。解法2: 利用选择排序或交
- 通过spring注解开发,测试单例和多例区别1.注解和配置两种用法形式配置版:注解版:2.在spring框架中,scope作用域默认是单例的
- iText介绍和说明因为项目需要生成PDF文件,所以去找了一下能够生成PDF的Java工具,看到了iText可以说好评如潮。如果你想通过ja
- 本文实例讲述了C#使用foreach遍历哈希表(hashtable)的方法。分享给大家供大家参考。具体实现方法如下:using System
- 首先是.select在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。其中要注意的细节:wrapper.s
- 1、需要引入依赖<dependency> &l
- 在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁。S