设计模式之工厂模式

工厂模式
  • 特点:实现了创建者和调用者的分离

    • 面向对象设计的基本原则:

      • OCP(开闭原则 ,Open-Closed Principle)一个软件的实体应当对外扩展开放,对修改关闭

        增加新功能时,尽量增加新的类来实现,不要修改原有的类

      • DIP(依赖倒转原则,Dependence Inversion Principe) 要求面向接口编程,不要针对实现编程

        依赖关系从具体转到抽象,尽量调用接口而不去继承实体类

      • LOD(迪米特法则,Law of Demeter) 只与你直接的朋友通信,而避免和陌生人通信

        可以实现解耦

    • 核心本质:

      实例化对象,用工厂方法代替new操作;将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。

  • 分类:

    • 简单(静态)工厂模式(常用)

      工厂类一般使用静态方法,通过接受不同的参数返回不同的对象实例。

      用来生产同一等级结构中的任意产品,对于增加新的产品需要修改已有代码

      测试代码:

      实体类:

      package com.wzg.factory.simplefactory;
      
      public interface Car {
      	void run();
      }
      
      package com.wzg.factory.simplefactory;
      
      public class Audi implements Car{
      
      	@Override
      	public void run() {
      		System.out.println("这是奥迪车");
      	}
      }
      
      package com.wzg.factory.simplefactory;
      
      public class BMW implements Car{
      
      	@Override
      	public void run() {
      		System.out.println("这是宝马车");
      	}
      }
      

      (1)未使用简单工厂模式:

      UML结构图:

      package com.wzg.factory.simplefactory;
      /**
       * 没有简单工厂模式情况下
       * @author wang
       * 既要知道接口类,又要知道实现类。要进行new创建
       */
      public class Client1 { // 调用者
      	public static void main(String[] args) {
      		Car c1 = new Audi();
      		Car c2 = new BMW();
      		
      		c1.run();
      		c2.run();
      	}
      }
      

      (2)简单工厂模式:

      UML示意图:

      创建者类:

      package com.wzg.factory.simplefactory;
      /**
       * 
       * @author wang
       * 小问题:
       * 		增加新功能时要修改原来的代码,比如下面增加新的车辆,要继续增加else if 等,
       * 		这样就违反了开闭原则。
       */
      public class CarFactory { //创建者
      	
      	public static Car createCar(String type) {
      		if ("奥迪".equals(type)) {
      			return new Audi();
      		} else if ("宝马".equals(type)) {
      			return new BMW();
      		} else {
      			return null;
      		}
      	}
      	
      //	// 另一种实现方式
      //	public static Car createAudi() {
      //		return new Audi();
      //	}
      //	public static Car createBMW() {
      //		return new BMW();
      //	}
      }
      

      调用者类:

      package com.wzg.factory.simplefactory;
      /**
       * 应用简单工厂模式
       * @author wang
       * 整体关系变复杂了,但是对于调用者来书变简单了。
       */
      public class Client2 { // 调用者
      	public static void main(String[] args) {
      		Car c1 = new CarFactory().createCar("奥迪");
      		Car c2 = new CarFactory().createCar("宝马");
      		
      		c1.run();
      		c2.run();
      	}
      }
      
    • 工厂方法模式

      用来生产同一等级结构中的固定产品,支持增加任意产品

      • 为避免简单工厂模式的缺点,不完全满足于OCP
      • 工厂方法模式和简单工厂模式的最大不同在于,简单工厂模式只有一个(对于一个项目或一个独立的模块)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

      UML示意图:

      测试代码:

      工厂类:

      package com.wzg.factory.factorymethod;
      
      public interface CarFactory {
      	Car createCar();
      }
      
      package com.wzg.factory.factorymethod;
      
      public class AudiFactory implements CarFactory{
      	
      	@Override
      	public Car createCar() {
      		return new Audi();
      	}
      }
      
      package com.wzg.factory.factorymethod;
      
      public class BenzFactory implements CarFactory{
      	
      	@Override
      	public Car createCar() {
      		return new Benz();
      	}
      }
      

      调用者:

      package com.wzg.factory.factorymethod;
      
      public class Client {
      	public static void main(String[] args) {
      		Car c1 = new AudiFactory().createCar();
      		c1.run();
      		
      		Car c2 = new BMWFactory().createCar();
      		c2.run();
      	}
      }
      

      想要添加新的功能,只需添加新对应的类。例如添加Benz。

      首先添加实体类

      package com.wzg.factory.factorymethod;
      
      public class Benz implements Car{
      	@Override
      	public void run() {
      		System.out.println("这是奔驰车");
      	}
      }
      

      然后添加工厂类:

      package com.wzg.factory.factorymethod;
      
      public class BenzFactory implements CarFactory{
      	
      	@Override
      	public Car createCar() {
      		return new Benz();
      	}
      }
      
    • 抽象工厂模式

      用来生产不同产品族的全部产品。对于新增的产品,无能为力;支持增加产品族。

      抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

      例如:在下面的例子中,汽车简单有三部分:发动机,座椅,轮胎。则三个对应的接口组成了一个产品族。具体类型有LowEngine,LowSeat,LowTyre组成低端汽车,LuxuryEngine,LuxurySeat,LuxuryTyre组成高端汽车,等等或其他组合。

      UML结构示意图:

      package com.wzg.factory.abstractFactory;
      
      public interface Engine {
      	void run();
      	void start();
      }
      
      class LuxuryEngine implements Engine{
      	@Override
      	public void run() {
      		System.out.println("好的发动机run");
      	}
      	
      	@Override
      	public void start() {
      		System.out.println("好的发动机start");
      	}
      }
      
      class LowEngine implements Engine{
      	@Override
      	public void run() {
      		System.out.println("差的发动机run");
      	}
      	
      	@Override
      	public void start() {
      		System.out.println("差的发动机start");
      	}
      }
      
      package com.wzg.factory.abstractFactory;
      
      public interface Seat {
      	void massage();
      }
      
      class LuxurySeat implements Seat{
      	
      	@Override
      	public void massage() {
      		System.out.println("高端座椅");
      	}
      }
      
      class LowSeat implements Seat{
      	
      	@Override
      	public void massage() {
      		System.out.println("低端座椅");
      	}
      }
      
      package com.wzg.factory.abstractFactory;
      
      public interface Tyre {
      	void revolve();
      }
      
      class LuxuryTyre implements Tyre{
      	@Override
      	public void revolve() {
      		System.out.println("高端轮胎");
      	}
      }
      
      class LowTyre implements Tyre{
      	@Override
      	public void revolve() {
      		System.out.println("低端轮胎");
      	}
      }
      
      package com.wzg.factory.abstractFactory;
      
      public interface CarFactory {
      	Engine createEngine();
      	Seat createSeat();
      	Tyre createTyre();
      }
      
      package com.wzg.factory.abstractFactory;
      
      public class LowCarFactory implements CarFactory{
      	@Override
      	public Engine createEngine() {
      		return new LowEngine();
      	}
      	@Override
      	public Seat createSeat() {
      		return new LowSeat();
      	}
      	@Override
      	public Tyre createTyre() {
      		return new LowTyre();
      	}
      }
      
      package com.wzg.factory.abstractFactory;
      
      public class LuxuryCarFactory implements CarFactory{
      	@Override
      	public Engine createEngine() {
      		return new LuxuryEngine();
      	}
      	@Override
      	public Seat createSeat() {
      		return new LuxurySeat();
      	}
      	@Override
      	public Tyre createTyre() {
      		return new LuxuryTyre();
      	}
      }
      
      package com.wzg.factory.abstractFactory;
      
      public class Client {
      	public static void main(String[] args) {
      		CarFactory factory = new LowCarFactory();
      		Engine engine = factory.createEngine();
      		engine.run();
      		engine.start();
      	}
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值