工厂设计模式

工厂设计模式

该设计模式解决的问题是:将类实例化的操作与使用对象的操作分开,让使用者不用知道具体参数就可以实例化出所需要的产品类,从而避免了在客户端代码中显式指定,实现了解耦。

该设计模式分为三种实现

  1. 简单工厂设计模式
  2. 工厂方法实现模式
  3. 抽象工厂实现模式

简单工厂设计模式

一个汽车工厂生产汽车。有特斯拉、大众、五菱

车的接口

public interface Car {
    void printName();
}

大众

public class DaZhong implements Car{
    @Override
    public void printName() {
        System.out.println("大众");
    }
}

特斯拉

public class TeSiLa implements Car{
    @Override
    public void printName() {
        System.out.println("特斯拉");
    }
}

五菱

public class WuLin implements Car{
    @Override
    public void printName() {
        System.out.println("五菱宏光");
    }
}

工厂

public class CarFactory {
    public static Car getCar(String carName){
        if("大众".equals(carName)){
            return new DaZhong();
        }else if("五菱宏光".equals(carName)){
            return new WuLin();
        }else if("特斯拉".equals(carName)){
            return new TeSiLa();
        }else {
            return null;
        }
    }
}

缺点:很难横向拓展,如果我后期需要加新的车型,需要改变原来的代码,不符合开闭原则(OOP七大原则)

优点:简单易懂

可以简单优化

public class CarFactory {
    public static Car getWuLin(){
        return new WuLin();
    }
    public static Car getDaZhong(){
        return new DaZhong();
    }
    public static Car getTeSiLa(){
        return new TeSiLa();
    }
}

工厂方法实现模式

还是简单工厂的模型,我们来换个工厂

这一次我们定义一个汽车工厂的接口

public interface CarFactory {
    Car getCar();
}

特斯拉工厂

public class TeSiLaCarFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new TeSiLa();
    }
}

大众工厂

public class DaZhongCarFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new DaZhong();
    }
}

五菱工厂

public class WuLinCarFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLin();
    }
}

缺点:当汽车类型很多的时候,会有很多很多很多各自的工厂,没有必要

抽象工厂实现模式

这次我们换一个场景:小米和华为都有路由器和手机的产品

路由器接口

public interface Router {
    void doConfig();
    void printInfo();
}

手机接口

public interface MobilePhone {
    void sendMsg();
    void callUp();
}

厂家接口

public interface ProductFactory {
    MobilePhone getMobilePhone();
    Router getRouter();
}

华为手机

public class HuaWeiMobilePhone implements MobilePhone {
    @Override
    public void sendMsg() {
        System.out.println("华为手机发信息");
    }

    @Override
    public void callUp() {
        System.out.println("华为手机打电话");
    }
}

华为路由器

public class HuaWeiRouter implements Router {
    @Override
    public void doConfig() {
        System.out.println("华为路由器配置");
    }

    @Override
    public void printInfo() {
        System.out.println("华为路由器打印详细信息");
    }
}

小米路由器

public class XiaoMiRouter implements Router {
    @Override
    public void doConfig() {
        System.out.println("小米路由器配置");
    }

    @Override
    public void printInfo() {
        System.out.println("小米路由器打印详细信息");
    }
}

小米手机

public class XiaoMiMobilePhone implements MobilePhone {
    @Override
    public void sendMsg() {
        System.out.println("小米手机发信息");
    }

    @Override
    public void callUp() {
        System.out.println("小米手机打电话");
    }
}

华为厂商

public class HuaWeiFactory implements ProductFactory {
    @Override
    public MobilePhone getMobilePhone() {
        return new HuaWeiMobilePhone();
    }

    @Override
    public Router getRouter() {
        return new HuaWeiRouter();
    }
}

小米厂商

public class XiaoMiFactory implements ProductFactory {
    @Override
    public MobilePhone getMobilePhone() {
        return new XiaoMiMobilePhone();
    }

    @Override
    public Router getRouter() {
        return new XiaoMiRouter();
    }
}

两个维度,第一个维度是产品族(路由器、手机),第二个维度是具体厂商(华为,小米)。

根据这两种维度分别设计了接口,抽象的工厂定义生产哪些产品族,具体的工厂具体实现自己的产品族

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻\n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值