二、抽象工厂模式(Abstract Factory Pattern)

1. 什么是抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式属于创建型模式,它将只生产单一类型产品但彼此之间相互依赖的工厂聚集起来,成为一个超级工厂;比如:一辆汽车由轮胎,发动机等组成,抽象工厂将只生产轮胎和发动机的工厂进行聚集,形成超级工厂
在这里插入图片描述

2. 抽象工厂模式的角色组成

  1. 抽象工厂角色:用于定义一个产品由哪些组件组成的接口规范
  2. 具体工厂角色:实现了抽象工厂接口,完成了产品组件的具体创建;它代表一个系列或版本的产品
  3. 抽象产品角色:用于定义产品规范的接口
  4. 具体产品角色:实现了抽象产品接口,它与具体工厂之间是多对一的关系;他代表一个系列或版本的组件

3. 代码示例

  1. 抽象工厂角色:用于定义一个产品由哪些组件组成的接口规范
package com.lt.patterns.factory;

import com.lt.patterns.product.IEngine;
import com.lt.patterns.product.IWheel;

/**
 * 奔驰工厂规范:专门用于组装生产奔驰(假设此工厂只负责组装车轮和发动机)
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public interface IBenzFactory {

	public IEngine getEngine();
	public IWheel getWheel();
}
  1. 具体工厂角色:实现了抽象工厂接口,完成了产品组件的具体创建
package com.lt.patterns.factory.impl;

import com.lt.patterns.factory.IBenzFactory;
import com.lt.patterns.product.IEngine;
import com.lt.patterns.product.IWheel;
import com.lt.patterns.product.impl.Engine_01;
import com.lt.patterns.product.impl.Wheel_01;

/**
 * 01型奔驰工厂-生产01型奔驰,性能一般
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Benz_01_Factory implements IBenzFactory {

	@Override
	public IEngine getEngine() {
		return new Engine_01();
	}

	@Override
	public IWheel getWheel() {
		return new Wheel_01();
	}

}
package com.lt.patterns.factory.impl;

import com.lt.patterns.factory.IBenzFactory;
import com.lt.patterns.product.IEngine;
import com.lt.patterns.product.IWheel;
import com.lt.patterns.product.impl.Engine_02;
import com.lt.patterns.product.impl.Wheel_02;

/**
 * 01型奔驰工厂-生产02型奔驰,性能较好
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Benz_02_Factory implements IBenzFactory {

	@Override
	public IEngine getEngine() {
		return new Engine_02();
	}

	@Override
	public IWheel getWheel() {
		return new Wheel_02();
	}

}
  1. 抽象产品角色:用于定义产品规范的接口
package com.lt.patterns.product;

/**
 * 抽象工厂模式-发动机规范
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public interface IEngine {

	public void getEngine();
}
package com.lt.patterns.product;

/**
 * 抽象工厂模式-车轮规范
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public interface IWheel {

	public void getWheel();
}
  1. 具体产品角色:实现了抽象产品接口,它与具体工厂之间是多对一的关系
package com.lt.patterns.product.impl;

import com.lt.patterns.product.IEngine;

/**
 * 发动机系列-01型发动机
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Engine_01 implements IEngine {

	@Override
	public void getEngine() {
		System.out.println("01型发动机");
	}

}
package com.lt.patterns.product.impl;

import com.lt.patterns.product.IEngine;

/**
 * 发动机系列-02型发动机
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Engine_02 implements IEngine {

	@Override
	public void getEngine() {
		System.out.println("02型发动机");
	}

}
package com.lt.patterns.product.impl;

import com.lt.patterns.product.IWheel;

/**
 * 轮胎系列-01型轮胎:性能一般
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Wheel_01 implements IWheel {

	@Override
	public void getWheel() {
		System.out.println("01型轮胎");
	}

}
package com.lt.patterns.product.impl;

import com.lt.patterns.product.IWheel;

/**
 * 轮胎系列-02型轮胎:性能更加优秀
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Wheel_02 implements IWheel {

	@Override
	public void getWheel() {
		System.out.println("02型轮胎");
	}

}

4. 抽象工厂模式的特点

  • 优点:
  • 当新增一个系列的产品时,只需要新增一个具体工厂角色(UML图中绿色),满足“开闭原则”
  • 缺点:
  • 当同一个系列产品发生变化时,需要修改具体工厂
  • 另外:
  • 当产品的组件只有一个系列,或产品本身只有一个系列时,抽象工厂模式退化为工厂方法模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值