学习设计模式之工厂模式

首先来个总图

简单工厂模式

  • 该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:
    在这里插入图片描述
    下面使用代码来阐述:
    在这里插入图片描述
package com.zhouyou.factory.simple;

public class FactoryCar {
    public static Car getCar(String car){
        if(car.equals("大众")){
            return new dazhongCar();
        }
        else if(car.equals("奥迪")){
            return new AodiCar();
        }else {
            return null;
        }
    }
    public static Car getDaZhong(){
        return new dazhongCar();
    }
}

public class dazhongCar implements Car {
    @Override
    public void name() {
        System.out.println("大众");
    }
}
public class Consumer {

    public static void main(String[] args) {
        Car car1 = FactoryCar.getCar("大众");
        Car car2 = FactoryCar.getCar("奥迪");
        car1.name();
        car2.name();
        Car daZhong = FactoryCar.getDaZhong();
        daZhong.name();
    }
}

总结:用来生产同一等级结构中任意产品, 缺点:如果增加新的产品,需要重新修改代码结构

工厂方法模式

  • 和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:
    在这里插入图片描述

也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

  • 接下来继续使用生产汽车的例子来讲解该模式。 car和AodiCar类和上述相同
//相当于中间多了一层,但是扩展性增加了
public interface FactoryCar {
    Car getCar();

}```

```java
public class AodiFactory implements FactoryCar{
    @Override
    public Car getCar() {
        return new AodiCar();
    }
}
public class Consumer {

    public static void main(String[] args) {
        new AodiFactory().getCar().name();
    }
}

用来生产同一登记结构中的固定产品,横向

抽象工厂模式

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。

简单的说就是一个超级工厂,管理着小工厂

在这里插入图片描述

每个工厂有不同的实现

在这里插入图片描述

优点十分明显,缺陷也十分明显,每次增加产品族时,所有超级工厂下的类都要新增实现

贴上代码:

package com.zhouyou.factory.abstract1;

public interface  ProductFactory {

    PhoneProduct phoneProduct();


    RouteProduct routeProduct();
}

package com.zhouyou.factory.abstract1;

public interface RouteProduct{

    void openWifi();

    void setting();

}

package com.zhouyou.factory.abstract1;

public interface PhoneProduct {

    void start();
    void shutdown();
    void call();
    void sms();
}

package com.zhouyou.factory.abstract1;

public class XiaomiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new XiaomiPhone();
    }

    @Override
    public RouteProduct routeProduct() {
        return new XiaomiRoute();
    }
}

package com.zhouyou.factory.abstract1;

public class HuaweiFactory implements ProductFactory{
    @Override
    public PhoneProduct phoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public RouteProduct routeProduct() {
        return new HuaweiRoute();
    }
}

package com.zhouyou.factory.abstract1;

public class XiaomiPhone implements PhoneProduct{
    @Override
    public void start() {
        System.out.println("小米开机");
    }

    @Override
    public void shutdown() {
        System.out.println("小米关机");
    }

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

    @Override
    public void sms() {
        System.out.println("小米发短信");
    }
}

package com.zhouyou.factory.abstract1;

public class HuaweiPhone implements PhoneProduct{
    @Override
    public void start() {
        System.out.println("华为开机");
    }

    @Override
    public void shutdown() {
        System.out.println("华为关机");
    }

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

    @Override
    public void sms() {
        System.out.println("华为发短信");
    }
}

package com.zhouyou.factory.abstract1;

public class client {

    public static void main(String[] args) {
        System.out.println("===============小米系列===============");
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        PhoneProduct phoneProduct = xiaomiFactory.phoneProduct();
        phoneProduct.sms();
        phoneProduct.call();

        System.out.println("===============华为系列");
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        PhoneProduct phoneProduct1 = huaweiFactory.phoneProduct();
        phoneProduct1.sms();
        phoneProduct1.call();
    }
}

  • 学自B站:狂神说
  • 谨以此记录学习,巩固记忆
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值