【设计模式学习】11种高频设计模式之工厂模式

本文详细介绍了工厂模式的三种形式:简单工厂、工厂方法和抽象工厂。通过具体的Java代码示例展示了如何创建和使用这些模式,以实现不同品牌产品的创建,同时强调了各模式在遵循开闭原则上的差异。通过对小米和华为产品的模拟,阐述了抽象工厂如何用于生产一系列相关产品。
摘要由CSDN通过智能技术生成

(本文食用提醒:文章为本人自学理解笔记,若有错误、欠妥之处,感谢指正!望共进步!)

工厂模式

在这里插入图片描述

来自BV1mc411h719中P4的18:17弹幕理解:
”工厂方法模式(小米只买手机)、抽象工厂方法(小米卖手机、路由器、电脑等)“

1.简单工厂

1.1 一句话理解

在一个固定的工厂里创建产品,可以在里面增加或减少生产的产品部件(例如在车工厂里生产五菱、特斯拉,这些车都可以有相同的部件或功能)。

1.2 代码目录

在这里插入图片描述

1.3 具体代码

car接口

package factory.simple;

public interface car {
    void name();
}

CarFactory类

package factory.simple;

//简单工厂模式又名静态工场模式

public class CarFactory {
    //方法一:如需增加新车型需要修改代码,违反了开闭原则
    public static car getCar(String car){
        if(car.equals("五菱")){
            return new WuLing();
        }else if(car.equals("特斯拉")){
            return new Tesla();
        }else{
            return null;
        }
    }

    //方法二:缺点——>冗余,增加新车型时仍需增加代码,修改类
    public static car WuLing(){
        return new WuLing();
    }
    public static car Tesla(){
        return new Tesla();
    }
}

Tesla类(继承了car接口)

package factory.simple;

public class Tesla implements car{
    @Override
    public void name(){
        System.out.println("特斯拉");
    }
}

WuLing类(继承了car接口)

package factory.simple;

public class WuLing implements car{
    @Override
    public void name(){
        System.out.println("五菱宏光");
    }
}

Consumer类(运行这个类看结果)

package factory.simple;

public class Consumer {
    public static void main(String[] args){
        //1.接口,所有的实现类!工厂
        //car car=new WuLing();
        //car car1=new Tesla();

        //2.使用工厂创建
        car car=CarFactory.getCar("五菱");
        car car1=CarFactory.getCar("特斯拉");
       
        car.name();
        car1.name();
    }
}

2.工厂方法

2.1 一句话理解

一个工厂里生产多种不同品牌但有相同结构产品(如摩拜、特斯拉、五菱……),相比于简单工厂模式,更符合开闭原则。

2.2 代码目录

在这里插入图片描述

2.3 具体代码

car接口(同上)

package factory.method;

public interface car {
    void name();
}

CarFactory接口(将类改成了接口)

package factory.method;

//工厂方法模式,满足开闭原则

public interface CarFactory {
    car getCar();
}

Consumer类(新增mobile车型)

package factory.method;

public class Consumer {
    public static void main(String[] args){
        car car=new WuLingFactory().getCar();
        car car1=new TeslaFactory().getCar();
        car car2=new MobileFactory().getCar();

        car.name();
        car1.name();
        car2.name();
    }
}

Mobile类(新增)

package factory.method;

public class Mobile implements car{
    @Override
    public void name(){
        System.out.println("摩拜单车");
    }
}

MobileFactory类(新增)

package factory.method;

public class MobileFactory implements CarFactory{
    @Override
    public car getCar(){
        return new Mobile();
    }
}

Tesla类(同上)

package factory.method;

public class Tesla implements car {
    @Override
    public void name(){
        System.out.println("特斯拉");
    }
}

TeslaFactory类(新增)

package factory.method;

public class TeslaFactory implements CarFactory {
    @Override
    public car getCar(){
        return new Tesla();
    }

}

WuLing类(同上)

package factory.method;

public class WuLing implements car {
    @Override
    public void name(){
        System.out.println("五菱宏光");
    }
}

WuLingFactory类(新增)

package factory.method;

public class WuLingFactory implements CarFactory {
    @Override
    public car getCar(){
        return new WuLing();
    }

}

3.抽象工厂

3.1一句话理解

一个工厂里生产 多种不同品牌但有相同结构产品工厂(如小米工厂、华为工厂……)

实例理解如下:
在这里插入图片描述
抽象工厂代码结构总括:
在这里插入图片描述
来自狂神的整个代码框架理解:
在这里插入图片描述

3.2 代码目录

在这里插入图片描述

3.3 具体代码

Client类(只需修改工厂名就能实现另一种生产产品的工厂)

package factory.abstract1;

public class Client {
    public static void main(String[] args){
        System.out.println("=================小米系列产品==============");
        //小米工厂
        XiaomiFactory xiaomiFactory=new XiaomiFactory();
        //小米手机
        IPhoneProduct iPhoneProduct= xiaomiFactory.iphoneProduct();
        iPhoneProduct.callup();
        iPhoneProduct.sendSMS();
        //小米路由器
        IRouterProduct iRouterProduct=xiaomiFactory.irouuterProduct();
        iRouterProduct.openwifi();
        iRouterProduct.setting();

        System.out.println("=================华为系列产品==============");
        //华为工厂
        HuaweiFactory huaweiFactory=new HuaweiFactory();
        //华为手机
        iPhoneProduct= huaweiFactory.iphoneProduct();
        iPhoneProduct.callup();
        iPhoneProduct.sendSMS();
        //华为路由器
        iRouterProduct=huaweiFactory.irouuterProduct();
        iRouterProduct.openwifi();
        iRouterProduct.setting();
    }
}

IProductFactory接口

package factory.abstract1;
//抽象产品工厂
public interface IProductFactory {
    //生产手机
    IPhoneProduct iphoneProduct();
    //生产路由器
    IRouterProduct irouuterProduct();
}

IPhoneProduct接口

package factory.abstract1;
//手机产品接口
public interface IPhoneProduct{
    void start();
    void shutdown();
    void callup();
    void sendSMS();
}

IRouterProduct接口

package factory.abstract1;
//路由器产品接口
public interface IRouterProduct {
    void start();
    void shutdown();
    void openwifi();
    void setting();
}

XiaomiFactory类(继承重写IProductFactory接口中的方法)

package factory.abstract1;

public class XiaomiFactory implements IProductFactory{
    @Override
    public IPhoneProduct iphoneProduct() {
        return new XiaomiPhone();
    }

    @Override
    public IRouterProduct irouuterProduct() {
        return new XiaomiRouter();
    }
}

XiaomiPhone类(继承重写IPhoneProduct接口中的方法)

package factory.abstract1;

public class XiaomiPhone 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 sendSMS() {
        System.out.println("小米发邮件。");
    }
}

XiaomiRouter类(继承重写IRouterProduct接口中的方法)

package factory.abstract1;

public class XiaomiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("开启小米路由器。");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭小米路由器。");
    }

    @Override
    public void openwifi() {
        System.out.println("小米wifi启动。");
    }

    @Override
    public void setting() {
        System.out.println("小米设置。");
    }
}

HuaweiFactory类(继承重写同XiaomiFactory类)

package factory.abstract1;

public class HuaweiFactory implements IProductFactory{
    @Override
    public IPhoneProduct iphoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public IRouterProduct irouuterProduct() {
        return new HuaweiRouter();
    }
}

HuaweiPhoe类(继承重写同XiaomiPhone类)

package factory.abstract1;

public class HuaweiPhone 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 sendSMS() {
        System.out.println("华为发邮件");
    }
}

HuaweiRouter(继承重写同XiaomiRouter类)

package factory.abstract1;

public class HuaweiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("打开华为路由器。");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭华为路由器。");
    }

    @Override
    public void openwifi() {
        System.out.println("华为wifi启动。");
    }

    @Override
    public void setting() {
        System.out.println("华为设置。");
    }
}

系列文章目录

一、单例模式
二、工厂模式
三、建造者模式
四、原型模式
五、适配器模式
六、代理模式
七、装饰器模式
八、迭代器模式
九、模板方法模式
十、策略模式
十一、责任链模式
十二、观察者模式
总结、12种常用设计模式


参考资料

【狂神说Java】通俗易懂的23种设计模式教学(停更)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值