玩转设计模式-工厂

概述

工厂,显而易见就是创建产品。在Java中,实例就是产品。我们通过创建工厂对象来生产实例而忽略创建细节。


简单工厂

定义:由一个工厂对象决定创建出哪一种产品类的实例
类型:创建型,但不属于GOF23种设计模式
优点:只需要传入一个正确的参数,就可以获取所需要的对象而无须知道其创建细节
缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则

看个栗子
在这里插入图片描述
Video

public abstract class Video {
	public abstract void produce();//抽象类方法
}

JavaVideo/PythonVideo

public class JavaVideo extends Video{
	@Override
	public void produce() {
		System.out.println("Java Video");	
	}
}

public class PythonVideo extends Video {
		@Override
		public void produce() {
			System.out.println("Python Video");	
		}
}

工厂实现

public class VideoFactory {
	
	public static Video getVideo(String type) {
		if("java".equals(type)) {//匹配字符进行创建实例
			return new JavaVideo();
		}else if("python".equals(type)) {
			return new PythonVideo();
		}
		return null;
	}
}

测试类:

public static void main(String[] args) {
		Video Java = VideoFactory.getVideo("java");//忽略创建实例细节,只需传入参数
		Java.produce();
	}

随着产品的扩展,VideoFactory需要增加判断逻辑,违背开闭原则。
我们通过反射的方法进行改进,增加可复用性。

public static Video getReflectVideo(Class klass) {
		Video video =null;
		try {
			//获取类的全限定名
			//根据反射基于类的全限定名创建此类
			//根据newInstance()创建类的实例
			video=(Video)Class.forName(klass.getName()).newInstance();
		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return video;
	}

工厂方法

定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类进行。父类工厂只指定规范,子类工厂负责生产具体产品。
一个类通过其子类来指定创建哪个对象
类型:创建型
优点:用户只需关心产品对应的工厂,无须关心创建细节;加入新产品符合开闭原则,提高可扩展性
缺点:类的个数容易过多,增加复杂度。
在这里插入图片描述
父类工厂提供规范

public abstract class VideoFactory {
	//子类实现
	public abstract Video getVideo();
}

子类工厂进行具体实现

public class PythonVideoFactory	extends VideoFactory {
	@Override
	public Video getVideo() {
		return new PythonVideo();
	}
}

public class JavaVideoFactory extends VideoFactory {
	@Override
	public Video getVideo() {
		return new JavaVideo();
	}
}

测试类:

public static void main(String[] args) {
		VideoFactory videoFactory = new JavaVideoFactory();//多态-子类转向父类
		Video video = videoFactory.getVideo();
		video.produce();
	}

抽象工厂

定义:抽象工厂模式提供一个创建一系列相关或依赖对象的接口-无须指定它们具体的类
优点:工厂相关共有的优点;一个系列的产品族统一到一起创建
缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品有困难,需要修改抽象工厂的接口;增加了系统的抽象性和理解难度
类型:创建型
在这里插入图片描述
举个栗子解释上图,一个产品族可以看成是一个公司的一系列产品,比如格力公司的空调,洗衣机,风扇等就属于同一个产品族;而美的空调,海尔空调,格力空调就属于同一个产品等级结构,前面的工厂方法用来解决同一产品结构的创建,而抽象工厂用来创建产品族,这实际上也是抽象工厂和工厂方法最大的区别。
在这里插入图片描述
我们先创建一个抽象产品族(抽象产品族中不指定的哪家工厂的产品族,同时指定抽象的产品结构)

public interface ProductFactory {
	//这条产品族中包含Fan和Air的产品等级结构
	//产品族中指定产品结构
	Fan getFan();  
	Air getAir();
}

具体的产品族实现工厂

//格力产品族
public class GeliProductFactory implements ProductFactory {
	@Override
	public Air getAir() {
		return new GeliAir();
	}
	
	@Override
	public Fan getFan() {
		return new GeliFan();
	}
}

//美的产品族
public class MeidiProductFactor implements ProductFactory {
	
	@Override
	public Air getAir() {
		return new MeidiAir();
	}
	
	@Override
	public Fan getFan() {
		return new MeidiFan();
	}
}

接下来是产品族中产品结构的抽象

//产品族在Air产品
public abstract class Air {
	public abstract void  produce();
}
//产品族中Fan产品
public abstract class Fan {
	public abstract void produce();
}

//产品结构的具体实现

//美的空调
public class MeidiAir extends Air {
	@Override
	public void produce() {
		System.out.println("生产美的空调");	
	}
}

//格力空调
public class GeliAir extends Air {
	@Override
	public void produce() {
		System.out.println("生产格力空调");	
	}
}

//美的风扇
public class MeidiFan extends Fan {
		@Override
		public void produce() {
			System.out.println("生产美的风扇");	
		}
}

//格力风扇
public class GeliFan extends Fan {
	@Override
	public void produce() {
		System.out.println("生产格力风扇");	
	}
}

测试类:

public static void main(String[] args) {
		ProductFactory factory = new GeliProductFactory();
		Fan fan = factory.getFan();
		Air air = factory.getAir();
		air.produce();//打印结果:生产格力空调
		fan.produce();//打印结果:生产格力风扇
}

抽象工厂方法在创建产品族上具有很好地扩展性,比如此时我想要加入新的产品族-海尔。只需要实现抽象产品族接口就可以但是在扩展产品结构上不符合开闭原则,比如此时我想要在产品族上添加洗衣机这个产品,则需要改动抽象产品族这个接口

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值