Java设计模式——工厂方法和抽象工厂方法

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂 角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

例如:

复制代码
 1 //交通工具必须实现的接口
 2 public interface Moveable {
 3     public void run();
 4 }
 5 
 6 //交通工具1.car
 7 public class Car implements Moveable{
 8 
 9     @Override
10     public void run() {
11         // TODO Auto-generated method stub
12         System.out.println("Car----------------");
13         
14     }
15 
16 }
17 
18 //交通工具2.plane
19 public class Plane implements Moveable{
20 
21     @Override
22     public void run() {
23         // TODO Auto-generated method stub
24         System.out.println("Plane----------------");
25     }
26 
27 }
28 
29 //作为工厂必须实现的接口
30 public interface Factory {
31     public Moveable create();
32 }
33 
34 //具体的交通工具工厂CarFactory
35 public class CarFactory implements Factory{
36 
37     @Override
38     public Moveable create() {
39         // TODO Auto-generated method stub
40         
41         return new Car();
42     }
43 
44 }
45 
46 //具体的交通工具工厂PlaneFactory
47 public class PlaneFactory implements Factory{
48 
49     @Override
50     public Moveable create() {
51         // TODO Auto-generated method stub
52         return new Plane();
53     }
54 
55 }
复制代码

测试1:

复制代码
1 public class Test {
2     public static void main(String args[]){
3         Factory fac = new PlaneFactory();
4         Moveable mov = fac.create();
5         mov.run();
6     }
7 }
复制代码

 

输出1:

Plane----------------

测试2:

复制代码
1 public class Test {
2     public static void main(String args[]){
3         Factory fac = new CarFactory();
4         Moveable mov = fac.create();
5         mov.run();
6     }
7 }
复制代码

输出2:

Car----------------

 

 

在上述例子中,工厂方法使我们能够定制任意交通工具的类型和生产过程,假设我们有了新的交通工具vihicle

复制代码
//交通工具3.vihicle
public class Vihicle implements Moveable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("Vihicle----------------");  
    }
}
复制代码

实现VihicleFactory类:

复制代码
1 public class VihicleFactory implements Factory{
2 
3     @Override
4     public Moveable create() {
5         // TODO Auto-generated method stub
6         return new Vihicle();
7     }
8 
9 }
复制代码

在生产过程中,我们只需new一个VihicleFactory并调用create()方法即可:

复制代码
1 public class Test {
2     public static void main(String args[]){
3         Factory fac = new VihicleFactory();
4         Moveable mov = fac.create();
5         mov.run();
6     }
7 }
复制代码

输出:

Vihicle----------------

在工厂方法中,每当我们有了新的Product需要生产时,我们就必须实现对应的ProductFactory,这样一来,随着Product数量的增多,往往容易造成ProductFactory泛滥,若我们想要生产十几种产品就要相应的实现十几个具体的工厂,这显然是不科学的,而抽象工厂方法正好解决了这个问题

例:

复制代码
  1 //食物接口
  2 public interface Food {
  3     public void printName();
  4 }
  5 
  6 //食物产品1.apple
  7 public class Apple implements Food{
  8 
  9     @Override
 10     public void printName() {
 11         // TODO Auto-generated method stub
 12         System.out.println("this is apple");
 13     }
 14 
 15 }
 16 
 17 //食物产品2.banana
 18 public class Banana implements Food{
 19 
 20     @Override
 21     public void printName() {
 22         // TODO Auto-generated method stub
 23         System.out.println("this is banana");
 24     }
 25 
 26 }
 27 
 28 //汽车接口
 29 public interface Vehicle {
 30     public void run();
 31 }
 32 
 33 //汽车产品1.benz
 34 public class Benz implements Vehicle{
 35 
 36     @Override
 37     public void run() {
 38         // TODO Auto-generated method stub
 39         System.out.println("Benz--------------");
 40     }
 41 
 42 }
 43 
 44 
 45 //汽车产品2.bwm
 46 public class BWM implements Vehicle{
 47 
 48     @Override
 49     public void run() {
 50         // TODO Auto-generated method stub
 51         System.out.println("BWM--------------");
 52     }
 53 
 54 }
 55 
 56 //武器接口
 57 public interface Weapon {
 58     public void shot();
 59 }
 60 
 61 
 62 //武器产品1.AK47
 63 public class AK47 implements Weapon{
 64     @Override
 65     public void shot(){
 66         System.out.println("AK47-------------");
 67     }
 68 }
 69 
 70 //武器产品2.M4
 71 public class M4 implements Weapon{
 72 
 73     @Override
 74     public void shot() {
 75         // TODO Auto-generated method stub
 76         System.out.println("M4--------------");
 77     }
 78 
 79 }
 80 
 81 //工厂接口
 82 public interface AbstractFactory {
 83     public Vehicle createVehicle();
 84     public Weapon  createWeapon();
 85     public Food     createFood();
 86 }
 87 
 88 //工厂1:能够生产BWM、AK47、Apple
 89 public class Factory1 implements AbstractFactory{
 90 
 91     @Override
 92     public Vehicle createVehicle() {
 93         // TODO Auto-generated method stub
 94         return new BWM();
 95     }
 96 
 97     @Override
 98     public Weapon createWeapon() {
 99         // TODO Auto-generated method stub
100         return new AK47();
101     }
102 
103     @Override
104     public Food createFood() {
105         // TODO Auto-generated method stub
106         return new Apple();
107     }
108 
109 }
110 
111 //工厂2:Benz、M4、Banana
112 public class Factory2 implements AbstractFactory{
113 
114     @Override
115     public Vehicle createVehicle() {
116         // TODO Auto-generated method stub
117         return new Benz();
118     }
119 
120     @Override
121     public Weapon createWeapon() {
122         // TODO Auto-generated method stub
123         return new M4();
124     }
125 
126     @Override
127     public Food createFood() {
128         // TODO Auto-generated method stub
129         return new Banana();
130     }
131 
132 }
复制代码

测试1:

复制代码
public class Test {
    public static void main(String args[]){
        AbstractFactory abs=new Factory1();
        Food fo = abs.createFood();
        Vehicle ve = abs.createVehicle();
        Weapon we = abs.createWeapon();
        fo.printName();
        ve.run();
        we.shot();
    }
}
复制代码

输出1:

this is apple
BWM--------------
AK47-------------

测试2:

复制代码
public class Test {
    public static void main(String args[]){
        AbstractFactory abs=new Factory2();
        Food fo = abs.createFood();
        Vehicle ve = abs.createVehicle();
        Weapon we = abs.createWeapon();
        fo.printName();
        ve.run();
        we.shot();
    }
}
复制代码

输出2:

1 this is banana
2 Benz--------------
3 M4--------------

抽象工厂的优点在于能够生产一系列可能存在关联的产品,但是,当我们需要在抽象工厂中添加新的产品时,几乎所有的工厂类都要修改

图片来自http://www.cnblogs.com/devinzhang/archive/2011/12/19/2293160.html

图片来自http://www.cnblogs.com/devinzhang/archive/2011/12/19/2293160.html

 

这样看来:

工厂模式生产一类产品(一个产品等级结构),来自同一个接口或抽象类

抽象工厂生产多类可能存在关联的产品(多个产品等级结构),来自多个接口或抽象类

智慧医药系统(smart-medicine)是一款采用SpringBoot架构构建的Java Web应用程序。其界面设计简洁而富有现代感,核心特色在于融合了当前前沿的生成式人工智能技术——具体接入了阿里云的通义千问大型语言模型,以此实现智能医疗咨询功能,从而增强系统的技术先进性与实用价值。该系统主要定位为医学知识查询与辅助学习平台,整体功能结构清晰、易于掌握,既适合编程初学者进行技术学习,也可作为院校课程设计或毕业项目的参考实现。 中医舌诊作为传统医学的重要诊断手段,依据舌象的颜色、形状及苔质等特征来辨析生理状况与病理变化。近年来,随着计算科学的进步,人工智能技术逐步渗透到这一传统领域,形成了跨学科的研究与应用方向。所述的中医舌诊系统正是这一方向的实践产物,它运用AI算法对舌象进行自动化分析。系统以SpringBoot为基础框架,该框架依托Java语言,致力于简化Spring应用程序的初始化与开发流程,其突出优势在于能高效构建独立、可投入生产的应用,尤其契合微服务架构与云原生环境,大幅降低了开发者在配置方面的负担。 系统中整合的通义千问大语言模型属于生成式人工智能范畴,通过海量数据训练获得模拟人类语言的能力,可在限定领域内生成连贯文本,为用户提供近似专业医生的交互式咨询。该技术的引入有助于提升诊断过程的自动化水平与结果一致性。 在设计与体验层面,本系统强调逻辑明晰与操作简便,旨在降低用户的学习门槛,尤其适合中医知识的入门教学。整体交互模式接近百科全书式查询,功能模块精炼聚焦,因而非常适用于教育场景,例如学术项目展示或毕业设计答辩。通过直观的实践界面,使用者能够更深入地理解中医舌诊的理论与方法。 此外,系统界面遵循简约大气的设计原则,兼顾视觉美感与交互流畅性,以提升用户的专注度与使用意愿。结合AI的数据处理能力,系统可实现对舌象特征的快速提取与实时分析,这不仅为传统诊断方法增添了客观量化维度,也拓展了中医知识传播的途径。借助网络平台,该系统能够突破地域限制,使更多用户便捷地获取专业化的中医健康参考,从而推动传统医学在现代社会的应用与普及。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【掺铒光纤放大器(EDFA)模型】掺铒光纤放大器(EDFA)分析模型的模拟研究(Matlab代码实现)内容概要:本文介绍了掺铒光纤放大器(EDFA)分析模型的模拟研究,并提供了基于Matlab的代码实现方案。通过对EDFA的工作原理、增益特性、噪声系数等关键性能指标进行数学建模与仿真分析,帮助研究人员深入理解其在光通信系统中的作用机制。文档还列举了多个相关科研方向的技术支持内容,涵盖智能优化算法、路径规划、无人机应用、通信与信号处理、电力系统管理等多个领域,展示了Matlab在科学研究与工程仿真中的广泛应用能力。此外,文中附带网盘链接,便于获取完整的代码资源与开发工具包。; 适合人群:具备一定光学通信或电子信息背景,熟悉Matlab编程,从事科研或工程仿真的研究生、高校教师及技术研发人员。; 使用场景及目标:①用于光通信系统中EDFA性能的理论分析与仿真验证;②支持科研人员快速构建测试EDFA模型,提升研究效率;③为教学实验、毕业设计及学术论文复现提供可靠的技术参考与代码基础。; 阅读建议:建议读者结合光通信基础知识,按照文档结构逐步运行并调试Matlab代码,重点关注模型参数设置与仿真结果分析,同时可利用提供的网盘资源拓展学习其他相关课题,深化对系统级仿真的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值