工厂模式可以简单的分为三类
- 简单工厂
- 工厂
- 抽象工厂
本篇只记录工厂和抽象工厂。
前言
在介绍工厂模式之前,我们需要先了解一下产品族体系结构和产品等级体系结构,这样对于我们理解工厂模式更有利。
定义/概念
- 产品等级结构:指在某一产品大类中不同的产品项目所构成的不同形式
- 产品族体系结构:产品族设计一般都是从市场分析、对顾客的需求调查分析开始的,顾客的需求分析模型是产品平台规划的基础,是指顾客需求信息被采集、分析、取舍、分类、结构化并转换为设计规范的过程。
举例理解
在我们日常购物中,一定会有这样一种烦恼,比如买家用电器,如果想买空调,大家首先想到的就是格力,三菱,美的,大金等,但是如果想到冰箱,可能大家又会想到西门子,海尔等。但是如果这几家大厂只生产一种家用电器,那竞争力就太弱了,因此海尔也会有空调,洗衣机。同样美的一样有冰箱,洗衣机等。这就引出来了我们上述的概念问题。
- 产品等级结构:空调,冰箱,洗衣机(无关品牌)
我们可以看到,无关于品牌,只关注于产品类别,这就属于产品等级。
- 产品族体系结构:
- 海尔
- 空调
- 冰箱
- 洗衣机
- 美的
- 空调
- 冰箱
- 洗衣机
- 海尔
我们可以看到 在同一品牌下的不同产品,就属于产品族。
工厂模式
工厂模式主要就是来体现产品等级这一概念的。
场景
我们这里假如需要购买空调,那么就会去选择哪个大厂生产的空调。使用代码来体现这种场景,就属于工厂模式的一种实现。
1.首先我们要买空调,那么就需要有一个空调,但是又不知道选择何种品牌的空调,因此我们用一个抽象类表示。
/**
* @ClassName AirConditioning
* @Description 空调类
* @Author Neal
* @Date 2019/3/6 14:55
* @Version 1.0
*/
public abstract class AirConditioning {
/**
* 购买空调
*/
public abstract void buy();
}
2.然后我们需要知道空调的生产厂,同样生产厂商很多,我们不能明确,那么就也来一个抽象类。
/**
* @ClassName AirConditioningFactory
* @Description 空调生产工厂
* @Author Neal
* @Date 2019/3/6 14:56
* @Version 1.0
*/
public abstract class AirConditioningFactory {
/**
* 生产空调
* @return
*/
public abstract AirConditioning produce();
}
3.现在我们去商场,了解到了,恩,需要格力或者美的的空调好。那么我们就需要格力和美的的生产工厂来生产对应的空调。
美的工厂
/**
* @ClassName MideaFactory
* @Description 美的生产工厂
* @Author Neal
* @Date 2019/3/6 15:00
* @Version 1.0
*/
public class MideaFactory extends AirConditioningFactory{
public AirConditioning produce() {
System.out.println("美的工厂生产的空调");
return new MideaAir();
}
}
美的空调
/**
* @ClassName MideaAir
* @Description 美的空调
* @Author Neal
* @Date 2019/3/6 14:58
* @Version 1.0
*/
public class MideaAir extends AirConditioning{
public void buy() {
System.out.println("购买美的空调");
}
}
格力工厂
/**
* @ClassName GreeFactory
* @Description 格力工厂
* @Author Neal
* @Date 2019/3/6 15:01
* @Version 1.0
*/
public class GreeFactory extends AirConditioningFactory {
public AirConditioning produce() {
System.out.println("格力工厂生产的空调");
return new GreeAir();
}
}
格力空调
/**
* @ClassName GreeAir
* @Description 格力空调
* @Author Neal
* @Date 2019/3/6 14:59
* @Version 1.0
*/
public class GreeAir extends AirConditioning{
public void buy() {
System.out.println("购买格力空调");
}
}
4.现在就让我们去选购吧。
/**
* @ClassName Customer
* @Description 顾客
* @Author Neal
* @Date 2019/3/6 15:03
* @Version 1.0
*/
public class Customer {
public static void main(String[] args) {
System.out.println("顾客去商场跟导购员说,我想要一个格力空调");
System.out.println("首先导购员给客户找到是格力工厂生产的空调");
AirConditioningFactory greeFactory = new GreeFactory();
System.out.println("接着告诉客户这是格力生产的");
AirConditioning greeAir = greeFactory.produce();
System.out.println("客户不满意,觉得美的好,又让导购员展示美的空调");
AirConditioningFactory mideaFactory = new MideaFactory();
System.out.println("导购给客户看了几个美的生产的空调");
AirConditioning mideaAir = mideaFactory.produce();
System.out.println("客户很满意,决定购买");
mideaAir.buy();
}
}
我们可以通过启动类来看到,我们想要什么工厂,导购员只需要创建出该工厂对象,然后获取到工厂生产的空调即可。因此我们只需要修改上层应用即可。如果我们想购买三菱的空调,那么我们只需要在创建一个三菱的工厂和空调即可。
5.我们来看一下类图。
工厂模式.png抽象工厂模式
抽象工厂就是来体现产品族体系结构的。
场景
我们买完空调之后,觉得洗衣机和冰箱也有点旧了,正好商场有活动,购买同一品牌的商品,套餐购买享5折优惠,套餐就是包括空调,洗衣机,冰箱。这么算下来,非常合适。既然这么合适,那么让我们使用代码来实现一下吧。
1.同样我们需要一个电器工厂,这里我们也不知道具体是哪个电器工厂,那么我们就使用接口来实现一下。
/**
* @InterfaceName ElectricFactory
* @Description 电器工厂
* @Author Neal
* @Date 2019/3/6 15:36
* @Version 1.0
*/
public interface ElectricFactory {
/**
* 生产空调
* @return
*/
AirConditioning produceAirConditioning();
/**
* 生产冰箱
* @return
*/
Refrigerator produceRefrigerator();
/**
* 生产洗衣机
* @return
*/
Washer produceWasher();
}
2.我们一组需要产品族。
空调
/**
* @ClassName AirConditioning
* @Description 空调
* @Author Neal
* @Date 2019/3/6 15:37
* @Version 1.0
*/
public abstract class AirConditioning {
public abstract void buy();
}
冰箱
/**
* @ClassName Refrigerator
* @Description 冰箱
* @Author Neal
* @Date 2019/3/6 15:37
* @Version 1.0
*/
public abstract class Refrigerator {
public abstract void buy();
}
洗衣机
/**
* @ClassName Washer
* @Description 洗衣机
* @Author Neal
* @Date 2019/3/6 15:38
* @Version 1.0
*/
public abstract class Washer {
public abstract void buy();
}
3.我们来规定一个品牌工厂---美的工厂。
/**
* @ClassName MideaFactory
* @Description 美的生产工厂
* @Author Neal
* @Date 2019/3/6 15:46
* @Version 1.0
*/
public class MideaFactory implements ElectricFactory {
public AirConditioning produceAirConditioning() {
return new MideaAirConditioning();
}
public Refrigerator produceRefrigerator() {
return new MideaRefrigerator();
}
public Washer produceWasher() {
return new MideaWasher();
}
}
4.这一产品的产品族。
美的空调
/**
* @ClassName MideaAirConditioning
* @Description 美的空调
* @Author Neal
* @Date 2019/3/6 15:47
* @Version 1.0
*/
public class MideaAirConditioning extends AirConditioning {
public void buy() {
System.out.println("购买套餐,美的空调");
}
}
美的冰箱
/**
* @ClassName MideaRefrigerator
* @Description 美的冰箱
* @Author Neal
* @Date 2019/3/6 15:48
* @Version 1.0
*/
public class MideaRefrigerator extends Refrigerator {
public void buy() {
System.out.println("购买套餐,美的冰箱");
}
}
美的洗衣机
/**
* @ClassName MideaWasher
* @Description 美的洗衣机
* @Author Neal
* @Date 2019/3/6 15:47
* @Version 1.0
*/
public class MideaWasher extends Washer {
public void buy() {
System.out.println("购买套餐,美的洗衣机");
}
}
5.大买特买,买买买。
/**
* @ClassName RichCustomer
* @Description TODO
* @Author Neal
* @Date 2019/3/6 15:54
* @Version 1.0
*/
public class RichCustomer {
public static void main(String[] args) {
System.out.println("挑选美商品");
ElectricFactory mideaFactory = new MideaFactory();
System.out.println("挑选空调");
AirConditioning mideaConditioning = mideaFactory.produceAirConditioning();
System.out.println("挑选冰箱");
Refrigerator mideaRefrigerator = mideaFactory.produceRefrigerator();
System.out.println("挑选洗衣机");
Washer mideaWasher = mideaFactory.produceWasher();
System.out.println("购买套餐");
mideaConditioning.buy();
mideaRefrigerator.buy();
mideaWasher.buy();
}
}
抽象工厂比较适合,体系比较固定的"产品族",因为他不支持频繁改动,如果工厂接口改动,那么所对应的工厂基本都会改动。
6.类图(这里有新增了格力系列,使我们看的更清晰)
抽象工厂1.png 抽象工厂2.png结论
希望通过这两个对比,大家可以理解工厂模式。
网友评论