java23种设计模式之工厂模式代码示例

概述

           工厂模式属于创建型的设计模式,具体又可以分为简单工厂,工厂方法,抽象工厂,是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();
    }
}

优点

        统一管理对象的创建代码,同样的方式创建不通的对象。

缺点

        当具体工厂类变得多的时候就会显得臃肿

推荐业务场景

        集成统一支付时候可以考虑使用工厂模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值