JAVA创建型模式--工厂模式

一、引言

好了好了,今天继续学习JAVA设计模式的工厂模式~

工厂模式是属于创建型模型的一种 ~

认真看完,你也能手写工厂模式,吊打面试官!

二、什么是工厂模式 

  • 实例化对象不用new,使用工厂方法代替。
  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟实现类解耦。而将调用者跟实现类解耦。

三、三种工厂模式

  1. 简单工厂模式 :用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有的代码)
  2. 工厂方法模式 :用来生产同一等级结构中的固定产品(支持增加任意产品)
  3. 抽象工厂: 围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

四、简单工厂模式:

介绍:工厂模式中最简单的使用方式

优点:比较简单实现,在项目中应用比较多

缺点:不满足开闭原则(对于新增加的产品,需要修改原来的代码

思路图:

 

实现: 

步骤1:接口的定义

/**
 * @Author WangYan
 * @Date 2022/6/15 10:23
 * @Version 1.0
 */
public interface Animal {

    void animal();
}

步骤2: Animal的实现类

/**
 * @Author WangYan
 * @Date 2022/6/15 13:42
 * @Version 1.0
 */
public class Dog implements Animal{

    @Override
    public void animal() {
        System.out.println("我是一个狗!");
    }
}

/**
 * @Author WangYan
 * @Date 2022/6/15 13:41
 * @Version 1.0
 */
public class Pig implements Animal {

    @Override
    public void animal() {
        System.out.println("我是一只猪!");
    }
}

步骤3 :实现工厂类,并且提供获取不同产品对象的方法

/**
 * @Author WangYan
 * @Date 2022/6/15 13:43
 * @Version 1.0
 * 简单工厂类
 */
public class FactoryAnimal {

    public static Animal getFactory(String animal){
        if (animal.equals("dog")){
            return new Dog();
        }else if (animal.equals("pig")){
            return new Pig();
        }else {
            return null;
        }
    }
}

/**
 * @Author WangYan
 * @Date 2022/6/15 13:45
 * @Version 1.0
 * Test测试类
 */
public class Test {

    public static void main(String[] args) {
        Animal dog = FactoryAnimal.getFactory("dog");
        Animal pig = FactoryAnimal.getFactory("pig");
        dog.animal();
        pig.animal();
    }
}

工厂方法模式:

介绍:简单的来说,工厂方法就是让类的实例化推迟到工厂子类去实现

优点:其实和简单工厂类似,用户只需要关心产品对应的工厂,无需关心创建产品的细节。但简单工厂有违背开闭原则,工厂方法解决很好地解决了这个问题。因为对象的实例化推迟到工厂的子类去实现,符合开闭原则,提高可扩展性

缺点:这个也很显而易见,如果新增一个产品,需要创建产品对象以及创建对应产品的工厂, 类的个数就容易增多,增加了复杂度

思路图:

实现:

步骤1:抽象接口工厂类

/**
 * @Author WangYan
 * @Date 2022/8/14 22:34
 * @Version 1.0
 * 工厂方法模式
 */
public interface AnimalFactory {

    Animal getAnimal();
}

步骤2:分别抽象接口的实现类

/**
 * @Author WangYan
 * @Date 2022/8/14 22:35
 * @Version 1.0
 */
public class DogFactory implements AnimalFactory {
    @Override
    public Animal getAnimal() {
        return new Dog();
    }
}

/**
 * @Author WangYan
 * @Date 2022/8/14 22:36
 * @Version 1.0
 */
public class PigFactory implements AnimalFactory {
    @Override
    public Animal getAnimal() {
        return new Pig();
    }
}

/**
 * @Author WangYan
 * @Date 2022/6/15 13:45
 * @Version 1.0
 * Test测试类
 */
public class Test {

    public static void main(String[] args) {
        Animal pig = new PigFactory().getAnimal();
        Animal dog = new DogFactory().getAnimal();

        pig.animal();
        dog.animal();
    }
}

抽象工厂模式: 

介绍:抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。

优点:无需关心创建细节,将一个系列的产品统一到一起创建。

缺点:产品族扩展新的产品比较困难,需要修改抽象工厂的定义,同时也增加了系统的抽象和理解难度。 

思路图:

实现: 

步骤1:定义两个抽象的产品接口ProductA,ProductB

1.ProductA

/**
 * @Author WangYan
 * @Date 2022/8/15 11:20
 * @Version 1.0
 * 手机产品接口
 */
public interface IphoneProduct {

    void start();

    void shutdown();

    void callup();

    void sendMessage();
}

/**
 * @Author WangYan
 * @Date 2022/8/15 11:26
 * @Version 1.0
 */
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 sendMessage() {
        System.out.println("小米手机发信息!");
    }
}

 

/**
 * @Author WangYan
 * @Date 2022/8/15 11:26
 * @Version 1.0
 */
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 sendMessage() {
        System.out.println("华为手机发信息!");
    }
}

2.ProductB

/**
 * @Author WangYan
 * @Date 2022/8/15 11:21
 * @Version 1.0
 * 路由器产品接口
 */
public interface IRouterProduct {

    void start();

    void shutdown();

    void callOpenWifi();
}

 

/**
 * @Author WangYan
 * @Date 2022/8/15 11:28
 * @Version 1.0
 */
public class XiaomiIRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("小米路由器开机!");
    }

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

    @Override
    public void callOpenWifi() {
        System.out.println("小米路由器打开wifi!");
    }
}

 

/**
 * @Author WangYan
 * @Date 2022/8/15 11:29
 * @Version 1.0
 */
public class HuaWeiIRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("华为路由器开机!");
    }

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

    @Override
    public void callOpenWifi() {
        System.out.println("华为路由器打开wifi!");
    }
}

 

步骤2:定义抽象工厂,并且提供创建多个产品的方法,然后有对应不同的产品工厂类,分别实现该方法。

/**
 * @Author WangYan
 * @Date 2022/8/15 11:38
 * @Version 1.0
 * 抽象产品工厂
 */
public interface ProductFactory {

    // 手机
    IphoneProduct iphoneProduct();

    // 路由器
    IRouterProduct iRouterProduct();
}

 

/**
 * @Author WangYan
 * @Date 2022/8/15 11:43
 * @Version 1.0
 */
public class HuaWeiFactory implements ProductFactory {
    @Override
    public IphoneProduct iphoneProduct() {
        return new HuaWeiPhone();
    }

    @Override
    public IRouterProduct iRouterProduct() {
        return new HuaWeiIRouter();
    }
}

/**
 * @Author WangYan
 * @Date 2022/8/15 11:46
 * @Version 1.0
 */
public class XiaomiFactory implements ProductFactory {

    @Override
    public IphoneProduct iphoneProduct() {
        return new XiaomIPhone();
    }

    @Override
    public IRouterProduct iRouterProduct() {
        return new XiaomiIRouter();
    }
}

 

/**
 * @Author WangYan
 * @Date 2022/8/15 11:48
 * @Version 1.0
 * Test测试类
 */
public class Test {
    public static void main(String[] args) {

        System.out.println("=======小米系列产品=======");
        // 小米工厂
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
        iphoneProduct.callup();
        iphoneProduct.shutdown();

        xiaomiFactory.iRouterProduct().callOpenWifi();
    }
}

 

总结: 

简单工厂模式(静态工厂模式):虽然某种程度上不符合设计原则,但实际应用最多!

工厂方法模式 :不修改已有类的前提下,通过增加新的工厂类实现扩展,这样的话,类也会越来越多,变得比较复杂!

抽象工厂模式 :不可以增加产品,可以增加产品族

拜拜~

有任何问题欢迎大家指出~

Thank You !

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逸航不吃瓜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值