java设计模式之工厂方法模式
作者:u011546655 发布时间:2022-08-29 05:14:10
概要
设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。
定义
定义一个用于创建对象的接口,让其子类去决定实例化那个类
使用场景
任何使用复杂对象的地方,都可以使用工厂模式
UML
1.抽象工厂
抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等
所以可以用一个简单的方法概括,就是create();
2.具体汽车制造厂
具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等
3.抽象汽车
抽象汽车:汽车我们一般都知道,能跑,能放音乐,能导航,能转弯这些都是汽车的共性
4.具体汽车
抽象汽车:具体汽车实现了抽象汽车,具备其所有的功能,当然不同的汽车可能具备的功能还不一样
上述简单的做了介绍,大体而言就是,具体汽车厂制造相应的的汽车,比如:奥迪的工厂,制造奥迪汽车,大众的工厂,制造大众的汽车等
代码演示
上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:
(1)抽象汽车工厂
package com.zengtao.demo.factory;
/**
* 抽象工厂
*/
public abstract class CarFactory {
public abstract <T extends Car> T createCar(Class<T> cla);
}
(2)具体汽车工厂
package com.zengtao.demo.factory;
/**
* 奥迪工厂
*/
public class AudiFactory extends CarFactory {
@SuppressWarnings("unchecked")
@Override
public <T extends Car> T createCar(Class<T> cla) {
Car car = null;
try {
car = (Car) Class.forName(cla.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) car;
}
}
(3)定义抽象的车
package com.zengtao.demo.factory;
public abstract class Car {
public abstract void drive();
public abstract void selfNagive();
public abstract void playMusic();
}
(4)具体的车
(奥迪q3)
package com.zengtao.demo.factory;
public class AudiQ3Car extends AudiCar {
@Override
public void drive() {
System.out.println("AudiQ3Car 已经制造成功");
System.out.println("AudiQ3Car drive");
}
@Override
public void selfNagive() {
System.out.println("AudiQ3Car selfNagive");
}
@Override
public void playMusic() {
System.out.println("AudiQ3Car playMusic");
System.out.println("");
}
}
(奥迪q5)
package com.zengtao.demo.factory;
public class AudiQ5Car extends AudiCar {
@Override
public void drive() {
System.out.println("AudiQ5Car 已经制造成功");
System.out.println("AudiQ5Car drive");
}
@Override
public void selfNagive() {
System.out.println("AudiQ5Car selfNagive");
}
@Override
public void playMusic() {
System.out.println("AudiQ5Car playMusic");
System.out.println("");
}
}
(5)调用
package com.zengtao.demo;
import com.zengtao.demo.factory.AudiFactory;
import com.zengtao.demo.factory.AudiQ3Car;
import com.zengtao.demo.factory.AudiQ5Car;
public class Main {
public static void main(String[] str) {
// 创建工厂
AudiFactory audiFactory = new AudiFactory();
// 利用工厂制造q3车
AudiQ3Car audiQ3Car = audiFactory.createCar(AudiQ3Car.class);
// 利用工厂制造q5车
AudiQ5Car audiQ5Car = audiFactory.createCar(AudiQ5Car.class);
// 开始开车放音乐
audiQ3Car.drive();
audiQ3Car.playMusic();
audiQ5Car.drive();
audiQ5Car.playMusic();
}
}
(6)结果
以上呢,就里用工厂方法模式,实现了制造汽车的简单过程
第一点:
在抽象工厂中我们看到,createCar(Class cla)方法,我们为什么这样定义呢,使用反射去的方式去创建具体的车,这样,我们不同类型的车,只需要相应的条件,是不是都能产出了,所以这样写是有好处的,就像很多,奥迪有q3,q5,a4,a6,a7,a8等系列一样
第二点:
如果我们有其它的车,比如宝马,也具有宝马x1,320,x5等,我们也可以很简单的实现,只需要实现抽象工厂,然后具体汽车实现抽象car就好了,扩展也非常方便
总结
抽象工厂到这里也就差不多了,工厂方法模式是一个比较简单也挺好的一种设计模式
但是也有缺点,比如:如果有新的其它类型汽车,只需要实现抽象工厂和抽象汽车,也就新建两个类
但是如果不是汽车,是手机,那么,就要全部都写一遍,这样就会造成,非常多的类出现,是否采用工厂方法模式,还是根据需求来决定。
注意:大家也不要为了设计而去套用设计模式,当然工厂方法模式平时也很常用,比如:Activity的onCreate方法,我们也是根据自己定义的xml布局,加载生成相应的界面等等
来源:http://blog.csdn.net/u011546655/article/details/52384885
猜你喜欢
- 一、题目描述题目实现:获取远程服务器和客户机的IP地址和端口号。二、解题思路创建一个服务器类:ServerSocketFrame,继承JFr
- 我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大
- 写在前面,首先,我用的java转json序列化的工具是java开源的jackson。今天在做后端接口的时候,发现获取的json对象中少了几个
- SingleClick:@Retention(AnnotationRetention.RUNTIME)@Target(AnnotationT
- 前言上一篇:微服务网关Zuul上文中,我们介绍了微服务网关Zuul,Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 S
- .NETCORE 中的 Generic Host本文以自己在工作中学习和使用.net core generic-host 作一个总结。前言在
- 通过下面代码在构造函数中调用方法 SetShadow();即可实现无边框窗体的阴影效果了需要添加命名空间 using System.Runt
- Mybatis Plus流式查询mybatis plus 中自定义如下接口,就可以实现流式查询,mybatis 中同样适用。@Select(
- 下面的例子为使用自定义的列表适配器来显示列表。 View Code import android.os.Bundle; import and
- 一、项目简述功能: 主页显示商品; 所有蛋糕商品展示,可进行商品搜索; 点击商品进入商品详情页,具有立即购买功能,可增减购买商品数量亦可手动
- 复制文件并命名的超简洁写法没错又是我,这次为大家带来Java中 复制文件并命名的超简洁写法(请确保你的jre在1.8+),这次用到了File
- 本文实例为大家分享了Java工具类DateUtils的具体代码,供大家参考,具体内容如下import java.text.ParseExce
- 上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序。上次说的收集方法主要是把收集的信息通过Http的post请求把相关
- Result也是Struts2比较重要的一部分,在Result的配置中常用的有四种类型:dispatcher、redirect、chain和
- 前言最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分框架运行lock文件,这里就想到了shutdownhook,顺便学了学Ru
- 本文实例讲述了C#实现左截取和右截取字符串的方法,分享给大家供大家参考。具体方法分析如下:问题如下:使用C#语法编写程序时,我们需要截取一个
- 初始化sp 内部将数据放到 xml 文件中,加载时首先会将硬盘中文件读取到内存中,这样加快了访问速度这次从源码开始,看看里面具体做了什么//
- 觉得作者写得太好了,不得不收藏一下。对这个例子的理解://类型参数不能用基本类型,T和U其实是同一类型。//每次放新数据都成为新的top,把
- 问题场景今天小编在MyBatis 整合Spring 的时候,使用到了@MapperScan,在启动期出现了一个错误:Invalid defa
- 本文总结了我在学习hibernate的过程中,解决hibernate懒加载问题的四种方式。所谓懒加载(lazy)就是延时加载,延迟加载。什么