Spring常用到的几种设计模式--工厂模式

本文详细解析了工厂模式在软件设计中的应用,包括简单工厂、方法工厂和抽象工厂的概念、实现及优缺点,通过汽车制造场景生动阐述了不同模式的分工与协作。

一、工厂模式

工厂模式核心思想:只关心结果,隐藏复杂的过程

二、简单的工厂模式

在这里插入图片描述

BaoMa

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory;

/**
 * @author yangjikang
 * @date 2019/8/8 11:49
 * @modified By yangjikang
 * @since
 */
public class BaoMa implements Car {

    private String name = "宝马";

    @Override
    public String getName() {
        return this.name;
    }
}

BenChi

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory;

/**
 * @author yangjikang
 * @date 2019/8/8 11:49
 * @modified By yangjikang
 * @since
 */
public class BenChi implements Car {

    private String name = "奔驰";

    @Override
    public String getName() {
        return this.name;
    }
}

Car

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory;

/**
 * @author yangjikang
 * @date 2019/8/8 11:40
 * @modified By yangjikang
 * @since
 */
public interface Car {

    public String getName();
}

QiRui

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory;

/**
 * @author yangjikang
 * @date 2019/8/8 11:49
 * @modified By yangjikang
 * @since
 */
public class QiRui implements Car {

    private String name = "奇瑞";

    @Override
    public String getName() {
        return this.name;
    }
}

SimpleFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory;

/**
 * @author yangjikang
 * @date 2019/8/8 11:55
 * @modified By yangjikang
 * @since
 */
public class SimpleFactory {
    public Car getCar(String name){
        if ("奔驰".equals(name)){
            return new BenChi();
        }else if ("奇瑞".equals(name)){
            return new QiRui();
        }else if ("宝马".equals(name)){
            return new BaoMa();
        }else{
             return new Car() {
                @Override
                public String getName() {
                    return "不能生产该产品....";
                }
            };
        }
    }
}

TestEnter

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory;

/**
 * @author yangjikang
 * @date 2019/8/8 11:59
 * @modified By yangjikang
 * @since
 */
public class TestEnter {

    public static void main(String[] args) {
        Car baoma = new SimpleFactory().getCar("宝马");
        System.out.println(baoma.getName());

    }
}

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

简单工厂可以造很多种汽车品牌的车子。奔驰、宝马、奇瑞、、、、、

这样不符合实际生活,你见过哪个工厂能造这么多汽车品牌 的车子的?

下面就引伸出了 方法工厂

三、方法工厂

上面我们说了,一个汽车制造厂不可能造出很多汽车品牌的车子。所以现实生活中每个汽车品牌都有自己的工厂。
宝马有宝马汽车工厂、奥迪有奥迪汽车工厂、、、、、、

但是这些汽车工厂需要一个标准吧?不可能奥迪汽车生产的汽车有三个轮子,宝马生产的有五个轮子?

所以我们要有一个约束规则。就好比你们平时手机数据线一样,安卓的、苹果的、现在好像还有Type-c的。你见过第四种?

这就是一种约束。

在这里插入图片描述

BaoMaFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.func;

import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;

/**
 * @author yangjikang
 * @date 2019/8/8 14:06
 * @modified By yangjikang
 * @since
 */
public class BaoMaFactory implements CarFactory{

    @Override
    public Car getCar() {
        return new BaoMa();
    }
}

BenChiFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.func;

import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;

/**
 * @author yangjikang
 * @date 2019/8/8 14:06
 * @modified By yangjikang
 * @since
 */
public class BenChiFactory implements CarFactory{

    @Override
    public Car getCar() {
        return new BenChi();
    }
}

CarFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.func;

import com.jikang.factory.Car;

/**
 * 汽车工厂约束规则
 *
 * @author yangjikang
 * @date 2019/8/8 14:07
 * @modified By yangjikang
 * @since
 */
public interface CarFactory {
    Car getCar();
}

QiRuiFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.func;

import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;

/**
 * @author yangjikang
 * @date 2019/8/8 14:06
 * @modified By yangjikang
 * @since
 */
public class QiRuiFactory implements CarFactory{

    @Override
    public Car getCar() {
        return new QiRui();
    }
}

TestFuncFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.func;

import com.jikang.factory.Car;

/**
 * 方法工厂测试类
 *
 * @author yangjikang
 * @date 2019/8/8 14:09
 * @modified By yangjikang
 * @since
 */
public class TestFuncFactory {

    public static void main(String[] args) {
        Car car = new BenChiFactory().getCar();
        System.out.println(car.getName());
    }
}


需要什么车子就去找哪个工厂造。

那么显示生活中,你想买个奔驰车,不可能还要跑到奔驰生产厂,让它去上产吧?

一般你都会去店里,跟老板说,我想买个奔驰、老板就会从奔驰厂去进货,你说你想要宝马,老板就回去宝马厂商进货。

所以你想买什么车子,直接找老板就行了。

所以就引申出了 抽象工厂

四、抽象工厂

抽象工厂肯定要有一个抽象方法。为什么要用抽象工厂呢?为什么不用简单类和接口呢?

这就说为什么我们讲问题要循序渐进

我们一开始讲的简单工厂,缺点是什么?缺少分工,大杂烩,一个工厂做了所有工厂的事。

所以我们用方法工厂来分工。每个工厂做自己的事。

再然后我们讲了抽象工厂,就是简单工厂方法工厂的结合。

好处是什么呢?

以前用户有简单工厂的时候用户很方便,想要什么直接跟工厂说,但是这个工厂压力肯定大啊,全国那么多人,买个车还要排队等?

后来用了方法工厂工厂是方便了,但是用户复杂了,要自己去某某工厂要车子。

现在的抽象工厂模式,工厂方便了,用户也方便了。

在这里插入图片描述
AbstractFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.abstr;

import com.jikang.factory.BaoMa;
import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;

/**
 * @author yangjikang
 * @date 2019/8/8 14:31
 * @modified By yangjikang
 * @since
 */
public abstract class AbstractFactory {

     abstract Car getCar();

     public Car getCar(String name){
         if ("奔驰".equals(name)){
             return new BenChiFactory().getCar();
         }else if ("奇瑞".equals(name)){
             return new QiRuiFactory().getCar();
         }else if ("宝马".equals(name)){
             return new BaoMaFactory().getCar();
         }else{
             return new Car() {
                 @Override
                 public String getName() {
                     return "不能生产该产品....";
                 }
             };
         }
     }
}

AbstractFactoryTest

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.abstr;

/**
 * @author yangjikang
 * @date 2019/8/8 14:36
 * @modified By yangjikang
 * @since
 */
public class AbstractFactoryTest {
    public static void main(String[] args) {
        DefaultAbstractFactory defaultAbstractFactory = new DefaultAbstractFactory();
        System.out.println(defaultAbstractFactory.getCar("asdasd").getName());
    }
}

BaoMaFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.abstr;

import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;
import com.jikang.factory.func.CarFactory;

/**
 * @author yangjikang
 * @date 2019/8/8 14:06
 * @modified By yangjikang
 * @since
 */
public class BaoMaFactory extends AbstractFactory{

    @Override
    Car getCar() {
        return null;
    }
}

BenChiFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.abstr;

import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.func.CarFactory;

/**
 * @author yangjikang
 * @date 2019/8/8 14:06
 * @modified By yangjikang
 * @since
 */
public class BenChiFactory extends AbstractFactory{

    @Override
    public Car getCar() {
        return new BenChi();
    }

}

DefaultAbstractFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.abstr;

import com.jikang.factory.Car;

/**
 * @author yangjikang
 * @date 2019/8/8 14:36
 * @modified By yangjikang
 * @since
 */
public class DefaultAbstractFactory extends AbstractFactory{

    private QiRuiFactory qiRuiFactory = new QiRuiFactory();

    @Override
    Car getCar() {
        return this.qiRuiFactory.getCar();
    }
}

QiRuiFactory

/*
 * Copyright (C), 2013-2019, 天津大海云科技有限公司
 */
package com.jikang.factory.abstr;

import com.jikang.factory.Car;
import com.jikang.factory.QiRui;
import com.jikang.factory.func.CarFactory;

/**
 * @author yangjikang
 * @date 2019/8/8 14:06
 * @modified By yangjikang
 * @since
 */
public class QiRuiFactory extends AbstractFactory{

    @Override
    public Car getCar() {
        return new QiRui();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值