• 设计模式(3)---工厂模式


    在这里插入图片描述

    上一篇:单例模式

    1.什么是工厂模式?

       工厂模式是我们平时较常使用得一种设计模式,它实现了创建者与调用者分离。在工厂模式中,我们在创建对象得时候不会对客户端暴露创建逻辑,并且是通过使用一个共同得接口来指向新创建得对象。

       太官方了,整不懂?大白话就是:你买一个手机,直接从手机生产商那里提货用就行了,不用去管它手机内部是怎么构建得,功能是怎么实现得。

    2.什么时候使用工厂模式?

      工厂模式并不是任何时候都适合使用的,工厂模式在创建复杂的对象的适合更加适合使用,如果是普通对象直接new就完事了。因为使用工厂模式就需要引入一个工厂类,增加了系统的复杂度。

    3.工厂模式分类?

    1.简单工厂模式
      用来生产同一等级结构中的任意产品 。

    在这里插入图片描述

    /**
     *简单工厂---Car接口
     */
    public interface Car {
    
    	void name();
    }
    
    public class BenChi implements Car {
    
    	@Override
    	public void name() {
    		System.out.println("奔驰车");
    	}
    }
    
    public class BaoMa implements Car {
    
    	@Override
    	public void name() {
    		System.out.println("宝马车");
    	}
    }
    
    /**
     * 普通的方式---测试类
     */
    public class Test {
    
    	public static void main(String[] args) {
    		Car car=new BenChi();
    		Car car1 = new BaoMa();
    		car.name();
    		car1.name();
    	}
    }
    

    将上面的测试类使用工厂模式来进行改造:

    首先创建一个Car工厂类,用于获取Car。

    /**
     * Car工厂类
     */
    public class CarFactory {
    
    	//获取Car的方法
    	public static Car getCar(String carName) {
    		if (carName.equals("benchi")) {
    			return new BenChi();
    		} else if (carName.equals("baoma")) {
    			return new BaoMa();
    		} else {
    			return null;
    		}
    	}
    }
    
    

    然后编写测试类:

    public class Test01 {
    
    	public static void main(String[] args) {
    		Car benchi = CarFactory.getCar("benchi");
    		Car baoma = CarFactory.getCar("baoma");
    
    		benchi.name();
    		baoma.name();
    
    	}
    }
    

    以上代码分别使用了普通new对象的方法获取车工厂模式获取车两种不同的方式。

      但是如果现在我们想要一个大众车,那就需要去CarFactory中修改逻辑代码,这不符合OOP中的开闭原则(对扩展开放,对修改关闭),如果想要符合开闭原则,方便横向扩展,则可以使用工厂方法模式

    2.工厂方法模式
      用来生产同一等级结构中的固定产品。

    在这里插入图片描述

    1)修改CarFactory,注意是interface

    /**
     * Car工厂类
     */
    public interface CarFactory {
    
    	Car getCar();
    }
    

    2)创建一个新的BaoMaFactory

    public class BaoMaFactory implements CarFactory {
    
    	@Override
    	public Car getCar() {
    		return new BaoMa();
    	}
    }
    

    3)创建一个新的BenChiFactory

    public class BenChiFactory implements CarFactory {
    
    	@Override
    	public Car getCar() {
    		return new BenChi();
    	}
    }
    

    4)测试类

    public class Test02 {
    
    	public static void main(String[] args) {
    
    		Car baoma = new BaoMaFactory().getCar();
    		Car benchi  = new BenChiFactory().getCar();
    		
    		baoma.name();
    		benchi.name();
    	}
    }
    

      使用此种模式代码量明显比第一种代码量多,但是此种方式方便我们横向扩展,此时如果我们需要的是大众车,直接新创建一个DaZhongFactory就行了,不需要去修改原来的代码,符合开闭原则

      此种方式虽然满足了开闭原则,能够非常简单的实现横向扩展,但是!

      相信大家已经发现此种方式的弊端:如果我要10个车那就需要new 10个对应的车的工厂类。100个就需要100个对应车的工厂类……它让我们的整个项目体系更加复杂化了,所以工厂模式在实际的应用中简单工厂类反而使用的较多。

    3.抽象工厂模式
      围绕一个超级工厂创建其他厂,这个超级工厂可以看作是其他工厂的工厂。

      抽象工厂模式虽然也是工厂模式的一种,但是两者本质上还是有区别的。所以在设计模式中,我们也将抽象工厂模式工厂模式分开为两种不同的创建对象的模式。

    下一篇:抽象工厂模式

  • 相关阅读:
    CMS 阶段性了结
    Java 代码监控 JVM 运行状态 —— 记一次 JVM 调优的毛招
    ClassLoader PPT 总结
    记一次 CMS 回收异常问题 —— 跨代引用和循环依赖
    读懂 GC 日志
    ClassLoader 学习笔记
    java 可见性简单总结
    Kafka 基本原理整理
    秒杀系统个人总结
    centos 7 mongodb4.0 安装配置
  • 原文地址:https://www.cnblogs.com/wgty/p/12810438.html
Copyright © 2020-2023  润新知