23种设计模式(5)-抽象工厂模式

定义

抽象工厂模式属于创建型模式,提供了一种创建对象的最佳创建方式。

抽象工厂模式,是一个超级工厂,用于创建其他工厂的工厂。

介绍

用途:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

本质:抽象工厂模式是工厂方法模式的升级版;工厂方法模式针对的是只有一个产品族;而当产品族不止一个的时候,工厂方法模式就升级成了抽象工厂模式

案例代码

image-20211202235702091

由于代码篇幅较长,所以分成两部分

第一部分:产品部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//手机接口
interface IpPhoneProduct {
void printPhoneName();
}
//路由器接口
interface IpRouterProduct {
void printRouterName();
}

//华为手机
class HuaweiPhone implements IpPhoneProduct {
@Override
public void printPhoneName() {
System.out.println("华为手机");
}
}
//华为路由器
class HuaweiRouter implements IpRouterProduct {
@Override
public void printRouterName() {
System.out.println("华为路由器");
}
}

//小米手机
class XiaomiPhone implements IpPhoneProduct {
@Override
public void printPhoneName() {
System.out.println("小米手机");
}
}
//小米路由器
class XiaomiRouter implements IpRouterProduct {
@Override
public void printRouterName() {
System.out.println("小米路由器");
}
}

第二部分:生产工厂部分

和工厂方法模式进行对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//抽象产品工厂接口
public interface IpProductFactory {
//生产手机
IpPhoneProduct getipPhoneProduct();
//生产路由器
IpRouterProduct getipRouterProduct();
}

//华为产品生产商(实现抽象产品工厂接口)
class HuaweiProductFactory implements IpProductFactory {
@Override
public IpPhoneProduct getipPhoneProduct() {
return new HuaweiPhone();
}

@Override
public IpRouterProduct getipRouterProduct() {
return new HuaweiRouter();
}
}

//小米产品生产商(实现抽象产品工厂接口)
class XiaomiProductFactory implements IpProductFactory {
@Override
public IpPhoneProduct getipPhoneProduct() {
return new XiaomiPhone();
}

@Override
public IpRouterProduct getipRouterProduct() {
return new XiaomiRouter();
}
}

//测试类(消费者、调用者)
class Client {
public static void main(String[] args) {
//华为
//华为生产商生产华为手机
System.out.println(new HuaweiProductFactory().getipPhoneProduct());
//华为生产商生产华为路由器
System.out.println(new HuaweiProductFactory().getipRouterProduct());

//小米
//小米生产商生产小米手机
System.out.println(new XiaomiProductFactory().getipPhoneProduct());
//小米生产商生产小米路由器
System.out.println(new XiaomiProductFactory().getipRouterProduct());
}
}

对比和可以发现:他俩的区别就在于,一个是针对两个产品族以上的,一个是针对一个产品族的。

Contents
  1. 1. 定义
  2. 2. 介绍
  3. 3. 案例代码
|