概述
工厂模式属于创建型的设计模式,具体又可以分为简单工厂,工厂方法,抽象工厂,是23种设计模式中比较常见的一种模式,简单工厂严格来说并不能算是其中的一种,该模式主要是对对象的创建进行抽离,然后统一创建的方式。核心也是解耦,在各种源码中这种设计模式也比较常见。
一.简单工厂模式
/**
* @author 双子的小坏
* @date 2024/6/26 16:47:53
* @description : 产品接口
*/
public interface Product {
}
/**
* @author 双子的小坏
* @date 2024/6/26 16:43:08
* @description : 书类
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Book implements Product{
/**
* id
*/
private String id;
/**
* 书名
*/
private String name;
}
/**
* @author 双子的小坏
* @date 2024/6/26 16:41:36
* @description :铅笔类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class pencil implements Product{
/**
* id
*/
private String id;
/**
* 品牌
*/
private String brand;
}
/**
* @author 双子的小坏
* @date 2024/6/26 16:39:52
* @description : java 简单工厂模式示例(并不属于23种设计模式)
*/
public class SimpleFactory {
public static Product createStationery(int type){
if(1 == type) {
return new pencil();
}else if(2 == type) {
return new Book();
}else {
return null;
}
}
}
二.工厂方法模式
/**
* @author 双子的小坏
* @date 2024/6/26 16:47:53
* @description : 产品接口
*/
public interface Product {
//使用产品方法 可以替换成任何方法
void use();
}
/**
* @author 双子的小坏
* @date 2024/6/26 16:43:08
* @description : 书类
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Book implements Product {
/**
* id
*/
private String id;
/**
* 书名
*/
private String name;
@Override
public void use() {
//do something
System.out.println("用书来当泡面盖子");
}
}
/**
* @author 双子的小坏
* @date 2024/6/26 16:41:36
* @description :铅笔类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class pencil implements Product{
/**
* id
*/
private String id;
/**
* 品牌
*/
private String brand;
/**
* 使用的方法
*/
@Override
public void use() {
//do something
System.out.println("用铅笔画个大老虎");
}
}
/**
* @author 双子的小坏
* @date 2024/6/26 17:42:37
* @description : 工厂接口
*/
public interface Factory {
/**
* 创建实际产品的方法
* @return
*/
Product createProduct();
}
/**
* @author 双子的小坏
* @date 2024/6/26 17:58:28
* @description : 铅笔工厂类
*/
public class PencilFactory implements Factory{
@Override
public Product createProduct() {
return new pencil();
}
}
/**
* @author 双子的小坏
* @date 2024/6/26 17:58:58
* @description : 书工厂类
*/
public class BookFactory implements Factory{
@Override
public Product createProduct() {
return new Book();
}
}
/**
* @author 双子的小坏
* @date 2024/6/26 17:59:24
* @description : 方法工厂调用示例
*/
public class MethodFactory {
public static void main(String[] args) {
Factory factory = new BookFactory();
// Factory factory = new PencilFactory();
Product product = factory.createProduct();
product.use();
}
}
三.抽象工厂模式
/**
* @author 双子的小坏
* @date 2024/6/27 17:08:15
* @description : 球类
*/
public interface Ball {
void playBall();
}
/**
* @author 双子的小坏
* @date 2024/6/27 17:08:38
* @description : 足球类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FootBall implements Ball{
/**
* id
*/
private String id;
/**
* 品牌
*/
private String brand;
@Override
public void playBall() {
System.out.println("踢足球");
}
}
/**
* @author 双子的小坏
* @date 2024/6/27 17:13:05
* @description : 篮球类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasketBall implements Ball{
/**
* id
*/
private String id;
/**
* 品牌
*/
private String brand;
@Override
public void playBall() {
System.out.println("打篮球");
}
}
/**
* @author 双子的小坏
* @date 2024/6/27 16:44:03
* @description : 书产品
*/
public interface Book {
void lookBook();
}
package com.example.demo.service;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 双子的小坏
* @date 2024/6/27 16:44:36
* @description : 纸质书
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PaperBook implements Book{
/**
* id
*/
private String id;
/**
* 书名
*/
private String name;
@Override
public void lookBook() {
System.out.println("看纸质书");
}
}
package com.example.demo.service;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 双子的小坏
* @date 2024/6/27 17:07:11
* @description : 电子书
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ElectronlBook implements Book{
/**
* id
*/
private String id;
/**
* 书名
*/
private String bookName;
@Override
public void lookBook() {
System.out.println("看电子书");
}
}
package com.example.demo.service;
/**
* @author 双子的小坏
* @date 2024/6/27 17:15:45
* @description : 抽象工厂接口
*/
public interface AbstractFactory {
Ball createBall();
Book createBook();
}
package com.example.demo.service;
/**
* @author 双子的小坏
* @date 2024/6/27 17:20:59
* @description : 篮球和电子书工厂类
*/
public class BasketBallAndElectronBookFactory implements AbstractFactory{
/**
* 创建篮球
* @return
*/
@Override
public Ball createBall() {
return new BasketBall();
}
/**
* 创建电子书
* @return
*/
@Override
public Book createBook() {
return new ElectronlBook();
}
}
package com.example.demo.service;
/**
* @author 双子的小坏
* @date 2024/6/27 17:17:24
* @description : 足球和纸质书工厂类
*/
public class FootBallAndPaperBookFactory implements AbstractFactory{
/**
* 创建篮球
* @return
*/
@Override
public Ball createBall() {
return new BasketBall();
}
/**
* 创建纸质书
* @return
*/
@Override
public Book createBook() {
return new PaperBook();
}
}
package com.example.demo.service;
/**
* @author 双子的小坏
* @date 2024/6/27 17:23:44
* @description : 抽象工厂模式演示
*/
public class AbstractFactoryDemo {
public static void main(String[] args) {
/* AbstractFactory factory = new BasketBallAndElectronBookFactory();*/
AbstractFactory factory = new FootBallAndPaperBookFactory();
Ball ball = factory.createBall();
ball.playBall();
Book book = factory.createBook();
book.lookBook();
}
}
优点
统一管理对象的创建代码,同样的方式创建不通的对象。
缺点
当具体工厂类变得多的时候就会显得臃肿
推荐业务场景
集成统一支付时候可以考虑使用工厂模式