Java设计模式(工厂模式)
一.简单工厂模式
简单工厂模式就是把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了。而这种方法的缺点也很明显,违背了设计模式的开闭原则,因为如果你要增加工厂可以初始化的类的时候,你必须对工厂进行改建
代码如下:
package com.long88.ad.test; interface Car {
public void getCar();
}
package com.long88.ad.test; public class BMW implements Car{ @Override
public void getCar() {
System.out.printf("来一辆BMW!");
}
}
package com.long88.ad.test; public class BYD implements Car {
@Override
public void getCar() {
System.out.printf("来一辆BYD!");
}
}
package com.long88.ad.test; public class CarFactor { public static Car carFactor(Class<?> tClass){
if (tClass.getName().equals(BMW.class.getName())){
return new BMW();
}
if (tClass.getName().equals(BYD.class.getName())){
return new BYD();
}
return null;
}
}
package com.long88.ad.test; public class testFactory { public static void main(String[] args) {
Car car = CarFactor.carFactor(BYD.class);
car.getCar();
}
}
结果如图:
二. 工厂方法模式
设计一个工厂的接口,你想要什么东西,就写个类继承于这个工厂,这样就不用修改什么,直接添加就行了。就相当于,我这个工厂是用来生汽车的,而要什么品牌的汽车具体分到了每个车间,如果新多了一种品牌的汽车,直接新增一个车间就行了。那么问题又来了,如果想要生产大炮怎么办?
代码如下:
package com.long88.ad.test; interface Car {
public void getCar();
}
package com.long88.ad.test; public class BMW implements Car{ @Override
public void getCar() {
System.out.printf("来一辆BMW!");
}
}
package com.long88.ad.test; public class BYD implements Car {
@Override
public void getCar() {
System.out.printf("来一辆BYD!");
}
}
//抽象工厂
interface CarFactory{
public Car getCarByFactory();
}
// BMW 具体工厂类
class BMWfactory implements CarFactory{ @Override
public Car getCarByFactory() {
return new BMW();
}
}
// BYD 具体工厂类
class BYD factory implements CarFactory{ @Override
public Car getCarByFactory() {
return new BYD ();
}
}
public class TestFactory {
public static void main(String[] args) {
Car bmw= new BMWfactory().getCarByFactory();
bmw.getCar();
}
}
三. 抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂与工厂方法的区别,就在于产品簇的问题,多了一种产品,这时候怎么办呢,就是在接口类里面加上创建大炮的方法,然后每个车间就可以有两个子车间分别来生产汽车和大炮。这样的话缺点也很显然的冒了出来,如果我又想生产飞机,那么我要需要更改所有的工厂车间以及工厂接口。
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
代码如下:
package com.long88.ad.test; interface Car {
public void getCar();
}
package com.long88.ad.test; public class BMW implements Car{ @Override
public void getCar() {
System.out.printf("来一辆BMW!");
}
}
package com.long88.ad.test; public class BYD implements Car {
@Override
public void getCar() {
System.out.printf("来一辆BYD!");
}
}
package com.long88.ad.test; interface Plane{
public void getPlane();
}
package com.long88.ad.test; public class AirPlane implements Plane{ @Override
public void getPlane() {
System.out.printf("来一架客机!");
}
}
package com.long88.ad.test; public class BattlePlane implements Plane{
@Override
public void getPlane() {
System.out.printf("来一架战斗机!");
}
}
//抽象工厂
interface Factory{
public Car getCarByFactory();
public Plane getPlaneByFactory();
}
// 具体工厂类
class FactoryOne implements Factory{ @Override
public Car getCarByFactory() {
return new BMW();
} @Override
public Plane getPlaneByFactory() {
return new AirPlane();
}
}
// 具体工厂类
class FactoryTwo implements Factory{ @Override
public Car getCarByFactory() {
return new BYD();
} @Override
public Plane getPlaneByFactory() {
return new BattlePlane ();
}
}
public class TestFactory {
public static void main(String[] args) {
Car byd = new FactoryTwo().getCarByFactory();
byd.getCar();
Plane airPlane = new FactoryOne().getPlaneByFactory();
airPlane.getPlane();
}
}
/* 运行结果
来一辆BYD!
来一架客机!
*/
使用场景
当我们直接new一个对象比较麻烦时,比如构造方法传参数量太多;
再比如创建一个类A要先创建类B,这种使用new比较麻烦时就可以交给工厂去做,还减少了代码的重复。
Java设计模式(工厂模式)的更多相关文章
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- 一张图搞定Java设计模式——工厂模式! 就问你要不要学!
小编今天分享的内容是Java设计模式之工厂模式. 收藏之前,务必点个赞,这对小编能否在头条继续给大家分享Java的知识很重要,谢谢!文末有投票,你想了解Java的哪一部分内容,请反馈给我. 获取学习资 ...
- 10.Java设计模式 工厂模式,单例模式
Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...
- 学习:java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- java设计模式-工厂模式(springweb为例子)
一般而言,工厂模式分为3种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种工厂模式逐层深入吧. 一,从springWeb.jar包使用抽象工厂模式的一个例子聊起 之前对spring各种痴迷,所以在需 ...
- java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Java设计模式——工厂模式
一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...
- Java设计模式の工厂模式
-------------------------------------------------------- 目录: 一.序言 二.简单工厂模式 三.工厂方法模式 四.简单工厂和工厂方法模式的比 ...
- 1.Java设计模式-工厂模式
1.简单工厂模式(Factory Method) 常用的工厂模式是静态工厂模式,利用static修饰方法,作为一种类似于常见的工具类Utils等辅助效果,一般情况下工厂类不需要实例化. //1.定义一 ...
随机推荐
- pytorch --Rnn语言模型(LSTM,BiLSTM) -- 《Recurrent neural network based language model》
论文通过实现RNN来完成了文本分类. 论文地址:88888888 模型结构图: 原理自行参考论文,code and comment: # -*- coding: utf-8 -*- # @time : ...
- vscode安装使用
1.新建文件:cmd+n2.设置默认浏览器: https://blog.csdn.net/zSY_snake/article/details/83449571 3.view in browser不支持 ...
- form中label标签对齐,内容右对齐
给label设置一个固定长度即可: label{ display:inline-block; width:100px; text-align:right; }
- 使用 Apache James 3.3.0(开源免费) 搭建外网电子邮件服务器(基于 Windows + Amazon Corretto 8)
对于邮件服务器的安装,请先参阅: 使用 Apache James 3.3.0(开源免费) 搭建内网电子邮件服务器(基于 Windows + Amazon Corretto 8) https://www ...
- 5.Python安装依赖(包)模块方法介绍
1.前提条件 1). 确保已经安装需要的Python版本 2). 确保已经将Python的目录加入到环境变量中 2. Python安装包的几种常用方式 1). pip安装方式(正常在线安装) 2). ...
- Centos中Redis的下载编译与安装(超详细)
场景 NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充.随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数 ...
- 五种编程语言解释数据结构与算法——顺序表2(java与C++语言实现)
5.java实现方式: 5.1.顺序表的抽象结构 package com.xgp.顺序表; public interface MyList<T> { //1. initList(& ...
- 在 Nest.js 中使用 MongoDB 与 TypeORM
在 Nest.js 中使用 MongoDB 与 TypeORM 首先要在 database 文件夹里建立DatabaseModule模块文件, // database/database.module. ...
- 关于vector的描述
对于有些编译器而言,使用vector<vector<int>> vec;并不能通过,必须采用vector<vector<int> >vec才可以通过.两 ...
- CF #618 div.2
序 闲来无事,打场CF,本人蒟蒻,考场A了前三道,第四有解答 正文 T1 Non-zero 是道水题.... 给你一个序列a.要求你输出最少的操作次数使这个序列的累和与累乘都不为0: 一次操作指给\( ...