6

【设计模式】Java设计模式 -工厂模式 - 怒放吧德德

 2 years ago
source link: https://www.cnblogs.com/lyd-code/p/16653308.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【设计模式】Java设计模式 -工厂模式

😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 一个有梦有戏的人 @怒放吧德德
🌝分享学习心得,欢迎指正,大家一起学习成长!

简介

在大多情况下,我们都是用new去实例化对象。但是,有时候有的对象的类别有很多种,又存在着共性,就好比如汽车,有奔驰,红旗,宝马等品牌,如果是一个一个去创建类,那就需要创建很多,因此就需要用到工厂模式。

1、普通工厂(Simple Factory)模式

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
UML如图:

在这里插入图片描述

1|0①、定义类

首先定义一个汽车抽象类



package com.lyd.demo.entity;

/** * @Author: lyd * @Description: 产品实体 * @Date: 2022-08-21 */ public abstract class ICar { protected String name;

public ICar(String name) { this.name = name; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public abstract void contract();

public void pickUp() { System.out.println("提车->" + name); } }

定义奔驰汽车类和红旗汽车类。并且继承基类
奔驰:



package com.lyd.demo.entity;

/** * @Author: lyd * @Description: 奔驰汽车类 * @Date: 2022-08-21 */ public class BenzCar extends ICar { public BenzCar(String name) { super(name); }

public void contract() { System.out.println("奔驰旗舰店和客户签订合同"); } }

红旗类与奔驰类似,这里就不贴冗余代码了

1|0②、定义简单的工厂类



package com.lyd.demo.simpleFactory;

import com.lyd.demo.entity.BenzCar; import com.lyd.demo.entity.HongQiCar; import com.lyd.demo.entity.ICar;

import javax.naming.NotContextException;

/** * @Author: lyd * @Description: 普通工厂模式 * @Date: 2022-08-20 */ public class CarFactory { public static ICar createCar(String carId) throws NotContextException { switch (carId) { case "1": return new BenzCar("奔驰GLA"); case "2": return new HongQiCar("红旗H7"); default: throw new NotContextException("没有该编号的汽车"); } } }

1|0③、实例

对调用者来说,就只需要知道createCar方法,指定汽车的编号就可以实例化出对应的对象



package com.lyd.demo.test;

import com.lyd.demo.entity.ICar; import com.lyd.demo.simpleFactory.CarFactory;

import javax.naming.NotContextException;

/** * @Author: lyd * @Description: 测试类 * @Date: 2022-08-21 */ public class SimpleFactoryTest { public static void main(String[] args) throws NotContextException { ICar car = CarFactory.createCar("1"); car.contract(); car.pickUp(); } }

运行结果:

在这里插入图片描述

2、抽象工厂(Abstract Factory)模式

抽象工厂模式提供一个接口,不必去指定具体的产品,创建多个产品族的产品对象。对于普通的工厂来说,可以解决一类对象的创建,但是对象有时候很复杂,在有几十种对象中又分了好几种类型,只有一个工厂的话,实现起来就十分复杂,因此需要吧工厂分为很多种,就比如汽车中有奔驰、红旗等,在奔驰中又分为了A级C级等,这就可以吧奔驰,红旗创建各自的工厂,由工厂来划分是具体哪个对象。
UML如图:

在这里插入图片描述

1|0①、定义类

采用以上的Icar抽象类,本次定义了四个类:BenzGLA、BenzGLB、HongQiH5、HongQiH7



package com.lyd.demo.car.entity.benz;

import com.lyd.demo.car.entity.ICar;

/** * @Author: lyd * @Description: 奔驰GLA * @Date: 2022-08-21 */ public class BenzGLA extends ICar { public BenzGLA(String name) { super(name); }

public void contract() { System.out.println("奔驰旗舰店和客户签订合同-购买->" + name); } }

其他类都一样,就不一个一个粘贴

1|0②、定义工厂接口

ICarFactory:

只提供一个创建产品的接口



package com.lyd.demo.car.factory;

import com.lyd.demo.car.entity.ICar;

/** * @Author: lyd * @Description: 汽车工厂 * @Date: 2022-08-21 */ public interface ICarFactory { public ICar createProduct(String CarNo); }

定义奔驰和红旗的工厂类

两个工厂类也都是差不多,需要实现ICarFactory,并且实现具体方法,在此方法来根据需要生成对应的对象。



package com.lyd.demo.car.factory.impl;

import com.lyd.demo.car.entity.ICar; import com.lyd.demo.car.entity.benz.BenzGLA; import com.lyd.demo.car.entity.benz.BenzGLB; import com.lyd.demo.car.factory.ICarFactory;

/** * @Author: lyd * @Description: 奔驰汽车的工厂类 * @Date: 2022-08-21 */ public class BenzFactory implements ICarFactory { public ICar createProduct(String CarNo) { System.out.println("奔驰工厂"); ICar car = null; // 根据id创建产品 if (CarNo.equals("GLA")) { // 生成GLA型号的奔驰汽车 car = new BenzGLA(CarNo); } else if (CarNo.equals("GLB")) { // 生成GLB型号的奔驰汽车 car = new BenzGLB(CarNo); } if (car != null) return car; return null; } }

红旗的工厂类同

汽车工厂类:

根据一定的逻辑(本次实验根据编号)来生成对应的工厂,在由工厂去判断实例化哪个对象。



package com.lyd.demo.car.factory.impl;

import com.lyd.demo.car.entity.ICar; import com.lyd.demo.car.factory.ICarFactory;

/** * @Author: lyd * @Description: 汽车工厂 * @Date: 2022-08-21 */ public class CarFactory implements ICarFactory { public ICar createProduct(String CarNo) { ICarFactory factory = null; if (CarNo.equals("GLA") || CarNo.equals("GLB")) { // 如果是奔驰的品牌 factory = new BenzFactory(); } else { factory = new HongQiFactory(); } if (factory != null) { return factory.createProduct(CarNo); } return null; } }

1|0③、实例

测试抽象工厂模式



package com.lyd.demo.test;

import com.lyd.demo.car.entity.ICar; import com.lyd.demo.car.factory.impl.CarFactory;

/** * @Author: lyd * @Description: 测试类 * @Date: 2022-08-21 */ public class ProductTest { public static void main(String[] args) { CarFactory factory = new CarFactory(); ICar car = factory.createProduct("GLA"); car.contract(); } }

运行结果:

在这里插入图片描述

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK