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
猜你喜欢
- 本文实例讲述了C#使用oledb操作excel文件的方法。分享给大家供大家参考。具体分析如下:不管什么编程语言都会提供操作Excel文件的方
- C#字符集编码的使用ASCII:西欧字符集GB2312:国家简体中文字符集,兼容ASCII。BIG5:统一繁体字编码GBK:它是GB2312
- Java的动态绑定所谓的动态绑定就是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。java继承
- Java 中的 CyclicBarrier 是一种同步工具,它可以让多个线程在一个屏障处等待,直到所有线程都到达该屏障处后,才能继续执行。C
- 前言Google终于发布了一个和SQLite相关的库了。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间
- 效果图效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单;然后是发现界面推荐单曲,点击单曲就是直接进入播放界面;最后是全局播
- 详解C#编程获取资源文件中图片的方法本文主要介绍C#编程获取资源文件中图片的方法,涉及C#针对项目中资源文件操作的相关技巧,以供借鉴参考。具
- C#中保存Session的三种方法及Web.Config设置保存session到sql server;,需要指定Sql Server;服务器
- 今天突然想起来,java产生随机数的问题,上机试了一下,找到了一点区别,在这里总结一下;直接调用Math.random()是产生一个[0,1
- 一、简介SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入SpringBoot
- 1.pom文件示例2.执行mvn package出现异常mvn package3.异常堆栈详细信息[WARNING] Error injec
- 汉诺塔游戏一旦掌握了规律,其实是有点单调和无聊的,不过却是学习递归的一个绝佳例子,想当初学习老谭C的时候,就卡在这儿好长时间。对初学编程的人
- 文章按照 Socket 的 创建、连接、传输数据、释放资源的过程来写。给出方法、参数的详细信息。一,网络基础说到 Socket,需要学习一下
- 先来看看效果:一、添加依赖库的步骤1.项目的gradle文件内的做以下改动allprojects { repositories
- 简单工厂模式(Simple Factory),说他简单是因为我们可以将此模式比作一个简单的民间作坊,他们只有固定的生产线生产固定的产品。也可
- 本文实例为大家分享了C#实现简易点餐功能的具体代码,供大家参考,具体内容如下图示效果实现过程1.设计界面2.设计控件及其属性3.实现点击事件
- 一、java发展史1.java之父:詹姆斯·高家林2.关键时间点:1996年Java(1.0)发布,2004年Java(5.0)发扬光大,2
- 前言C#本身提供了很强大的控件库,但是很多控件库的功能只是一些基本的功能,就比如最简单的按钮,C#提供了最基础的按钮使用方法,但是如果要增加
- 最新需要公司要求在不改变原来的登录逻辑的情况下,将原来的验证码登录的形式改成滑动图片的形式!下面是做出来的效果:实现思路:所有的图片数据,验
- 需求:request的content-type为applciation/json,进入controller之前需要把body中的参数取出来做