• 23设计模式之 --------- 工厂模式


    💛1.工厂模式简介

    在这里插入图片描述
    有三种工厂的模式:

    1.1简单工厂模式

    在这里插入图片描述

    在这里插入图片描述

    常见常见消费者需要什么就去new 什么:
    在这里插入图片描述

    简单工厂模式实现了不需要直接new而是直接联系工厂即可

    在这里插入图片描述
    具体代码实现如下:

    Car

    public interface Car {
    
    void name();
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Tesla

    public class Tesla implements Car{
        @Override
        public void name() {
            System.out.println("特斯拉");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    WuLing

    public class WuLing implements Car{
        @Override
        public void name() {
            System.out.println("五菱宏光");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    工厂代码

    //此模式如果持续增加的话 会影响到开闭模式(简单工厂也可以称之为静态工厂模式)
    public class CarFactory {
    
        public static Car getConfig(String car){
            //方法一
            if (car.equals("五菱")){
                return new WuLing();
            }if (car.equals("特")){
                return new Tesla();
            }else {
                return null;
            }
    
    
    
        }
        //方法二
    public static Car getWuling(String WuLing){
    
            return new WuLing();
    }
    
    public static Car getTesla(String Tesla){
    
            return new Tesla();
        }
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    控制台 Consumer

    
    public class Consumer {
    
    
        public static void main(String[] args) {
            //1.普通方法
            Car  wuLing = new WuLing();
            Car tesla = new Tesla();
    
    
            wuLing.name();
            tesla.name();
    
         //   ------------------------
         //2.工厂模式
        Car le = CarFactory.getConfig("特");
        Car les = CarFactory.getConfig("五菱");
    
        le.name();
        les.name();
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    简单模式直接去new对象了然后获取他们的值展示出啦的;
    在这里插入图片描述
    工厂模式而是直接去调用工厂的代码,进行实现
    他的弊端是:影响了开闭原则不应该在新增的时候去修改工厂的代码;

    在这里插入图片描述
    在这里插入图片描述

    1.2工厂方法模式

    在这里插入图片描述
    WuLing

    public class WuLing implements Car {
        @Override
        public void name() {
            System.out.println("五菱宏光");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    WuLingFactory

    public class WuLingFactory implements CarFactory{
        @Override
        public Car getcar() {
            return new WuLing();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Tesla

    public class Tesla implements Car {
        @Override
        public void name() {
            System.out.println("特斯拉");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    TeslaFactory

    public class TeslaFactory implements CarFactory {
    
        @Override
        public Car getcar() {
            return new Tesla();
        }
    }
    
    ```java
    **BaoMa** 
    ```java
    public class BaoMa implements Car {
        @Override
        public void name() {
            System.out.println("宝马骑骑车");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    BaoMaFactory

    public class BaoMaFactory implements CarFactory {
    
        @Override
        public Car getcar() {
            return new BaoMa();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Car 每个车都会实现这个方法

    //工厂模式
    public interface Car {
        
    void name();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    CarFactory 每个车的方法都会实现这个方法

    //方法工厂方法模式
    public interface CarFactory {
    
        Car getcar();
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Consumer 控制台调用方法实现

    public class Consumer {
    
    
        public static void main(String[] args) {
            //1.工厂方法
             Car car = new WuLingFactory().getcar();
    
             Car car2 = new TeslaFactory().getcar();
    
            Car car3 = new BaoMaFactory().getcar();
    
             car.name();
             car2.name();
             car3.name();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果如下:

    在这里插入图片描述
    (他完美的避免了开闭原则,但是他的实现类方法会不断增多也是一种不友好的用户的体验)

    我们来看下实现图来更好的对他进行一个理解

    在这里插入图片描述
    两接口:一个代表车,一个代表车仓;每新增一种车就会新增一个车仓;

    我们可以对比分析下

    简单工厂和方法工厂的对比

    结构复杂度:简单工厂模式
    代码复杂度:简单工厂模式
    编程复杂度:简单工厂模式
    管理复杂度:简单工厂模式
    
    根据设计原则:工厂方法模式比较好(不会扰乱程序)
    根据实际业务:简单工厂模式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.3 抽象工厂模式

    在这里插入图片描述

    在这里插入图片描述

    Creator: 定义了产品生产的一系列行为;
    ConcreteCreator1: 工厂1
    ConcreteCreator2:工厂2
    不同的工厂生产不同的东西;

    ProductA: 抽象接口方法
    ProductB:抽象接口方法

    ProductA1:
    ProductA2:
    ProductB1:
    ProductB2:

    具体的抽象的方法(也就是具体的产品)他们是工厂创建的(ConcreteCreator)

    在这里插入图片描述

    产品等级和产品族如图上会帮助大家更好的理解;

    小米手机和华为属于同一的产品等级结构;
    小米手机和小米路由器属于同一家族;

    在这里插入图片描述
    相对固定的产品族可以考虑使用使用抽象工厂的模式经常变动的话就并不推荐了;

    在这里插入图片描述
    按照图形逻辑我们来实现下:

    代码结构如下:
    在这里插入图片描述
    IphoneProduct

    //手机产品接口
    public interface IphoneProduct {
    
         void start();//开机
         void shutdown();//关机
         void callup();//打电话
         void sendms();//发短信
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    XiaomiIphone

    public class XiaomiIphone implements IphoneProduct{
        @Override
        public void start() {
            System.out.println("小米手机开机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("小米手机关机");
        }
    
        @Override
        public void callup() {
            System.out.println("小米手机打电话");
        }
    
        @Override
        public void sendms() {
            System.out.println("小米手机发短信");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    HuweiIphone

    public class HuweiIphone implements IphoneProduct{
        @Override
        public void start() {
            System.out.println("华为手机开机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("华为手机关机");
        }
    
        @Override
        public void callup() {
            System.out.println("华为手机打电话");
        }
    
        @Override
        public void sendms() {
            System.out.println("华为手机发短信");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    IRouterProduct

    public interface IRouterProduct {
    
        void start();//开机
        void shutdown();//管家
        void callup();//开机
        void seeting();//设置
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    HuweiRouter

    public class HuweiRouter implements IRouterProduct{
        @Override
        public void start() {
            System.out.println("华为路由器开机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("华为路由器关机");
        }
    
        @Override
        public void callup() {
            System.out.println("华为路由器打电话");
        }
    
        @Override
        public void seeting() {
            System.out.println("华为路由器设置");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    XiaomiRouter

    public class XiaomiRouter implements IRouterProduct{
        @Override
        public void start() {
            System.out.println("小米路由器开机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("小米路由器关机");
        }
    
        @Override
        public void callup() {
            System.out.println("小米路由器打电话");
        }
    
        @Override
        public void seeting() {
            System.out.println("小米路由器设置");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    IProductFactory 抽象产品工厂

    //抽象产品工厂
    public interface IProductFactory {
    
        //手机工厂
        IphoneProduct IphoneProduct();
    
       //路由器工厂
        IRouterProduct IRouterProduct();
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    HuaweiFactory

    public class HuaweiFactory implements IProductFactory{
    
        @Override
        public IphoneProduct IphoneProduct() {
            return new HuweiIphone();
        }
    
        @Override
        public IRouterProduct IRouterProduct() {
            return new HuweiRouter();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    XiaomiFactory

    public class XiaomiFactory implements IProductFactory{
    
        @Override
        public IphoneProduct IphoneProduct() {
            return new XiaomiIphone();
        }
    
        @Override
        public IRouterProduct IRouterProduct() {
            return new XiaomiRouter();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Client 控制台

    public class Client {
    
        public static void main(String[] args) {
    
            System.out.println("-----------------------小米产品----------------------");
    
             XiaomiFactory xiaomiFactory = new XiaomiFactory();
    
             IphoneProduct iphoneProduct = xiaomiFactory.IphoneProduct();
    
              iphoneProduct.start();
              iphoneProduct.callup();
              iphoneProduct.sendms();
    
             IRouterProduct iRouterProduct = xiaomiFactory.IRouterProduct();
    
             iRouterProduct.seeting();
             iRouterProduct.shutdown();
             iRouterProduct.start();
    
    
    
            System.out.println("-----------------------华为产品----------------------");
    
    
            HuaweiFactory huaweiFactory = new HuaweiFactory();
    
            IphoneProduct iphoneProduct1 = huaweiFactory.IphoneProduct();
    
            iphoneProduct1.start();
            iphoneProduct1.callup();
            iphoneProduct1.sendms();
    
            IRouterProduct iRouterProduct2 = huaweiFactory.IRouterProduct();
    
            iRouterProduct2.seeting();
            iRouterProduct2.shutdown();
            iRouterProduct2.start();
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    运行结果如下:
    在这里插入图片描述

    在这里插入图片描述
    其实写完代码;我个人对抽象接口的理解就是一个接口一个实现;老子管儿子,儿子管孙子这么一个概念;接口不断的封装继续;其实大型项目结构稳定的使用是ok的经常变化的你今天加几个接口明天加几个也很麻烦,根据自己的业务逻辑自行判断吧;

    1.4 总结

    在这里插入图片描述

    设计模式只是一种思想;

    设计模式总目录:https://blog.csdn.net/qq_42055933/article/details/126613801?spm=1001.2014.3001.5501(查看其他章节请点击)

  • 相关阅读:
    Google Pub/Sub入门
    二十一、java版 SpringCloud分布式微服务云架构之Java 继承
    CAD VCL Multiplatform SDK 定制Crack
    vue:写一个数组box和list数组,在保留box数组中原有对象的同时,将list数组中每一个对象插入到box数组后面
    面试题:Promise用法及理解
    Springboot配置WebMvcConfig解决Cors非同源访问跨域问题
    数据仓库基础
    Docker基础入门:Docker基础总结篇--超详细
    【Java】涉及到GUI、JAVASE、网络编程、多线程、数据库的聊天系统,非常适合大学Java课程的练手
    关于AbstractQueuedSynchronizer的enq()方法的代码问题
  • 原文地址:https://blog.csdn.net/qq_42055933/article/details/126694875