0.阐述
工厂方法模式是一类产品的生产,如:畜牧场只养动物,电视机厂只生产电视机。
同种类称为同等级,也就是说工厂方法模式只产生同等级的产品,但现实生活中许多工厂是综合性工厂,能产生多等级的产品,如:农场里既养动物又养植物。小米既生产手机也生产空调、门锁、电视、笔、杯子。
抽象工厂是生产同一个产品族的不同等级产品
1.定义
抽象工厂模式:是为访问类提供一个创建一组相关或相互依赖的对象的接口,且访问类无须指定所要产品的具体类就能得到同族的产品的结构模式。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产
一个等级的产品,而抽象工厂模式可生产
多个等级的产品。
2.优点与缺点
使用抽象工厂模式一般要满足以下条件。
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级机构的产品。
- 系统只可能消费其中某一族产品,即同族产品一起使用。
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
- 可以在类的内部对产品族中相关联的多等级产品进行共同管理,而且不必专门引入多个新的类来进行管理。
- 当增加一个新的产品族时不需要修改源代码,满足开闭原则。
缺点:
- 当产品族中需要增加一个新的产品时,所有共产类都需要进行修改。
3.实现
模式的结构
抽象工厂模式的主要角色。
1)抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同等级的产品。
2)具体工厂(Concrete Factory):主要实现抽象工厂中的多个抽象方法,完成产品的创建。
3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对多的关系。
4.示例
以海尔能生产电视和空调,TCL也能生产电视和空调为例。
4.1抽象类
4.1.1抽象工厂类
1
2
3
4
5
6
7
8 1package ink.poesy.design.AbstractFactoryDesign;
2
3public interface AbstractFactory {
4 public Product newProduct1();
5 public Product2 newProduct2();
6}
7
8
4.1.2抽象产品类->空调
1
2
3
4
5
6
7 1package ink.poesy.design.AbstractFactoryDesign;
2
3public interface Product {
4 public void show();
5}
6
7
4.1.2抽象产品类->电视
1
2
3
4
5
6
7 1package ink.poesy.design.AbstractFactoryDesign;
2
3public interface Product2 {
4 public void show();
5}
6
7
额,好像跟空调的一样
4.2海尔
4.2.1海尔的具体工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class ConcreteFactory implements AbstractFactory {
4 @Override
5 public Product newProduct1() {
6 System.out.println("海尔->生产具体产品·空调·");
7 return new ConcreteProduct();
8 }
9
10 @Override
11 public Product2 newProduct2() {
12 System.out.println("海尔->生产具体产品·电视·");
13 return new ConcreteProduct2();
14 }
15}
16
17
4.2.2海尔的具体产品类->空调
1
2
3
4
5
6
7
8
9
10 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class ConcreteProduct implements Product {
4 @Override
5 public void show() {
6 System.out.println("海尔产出空调");
7 }
8}
9
10
4.2.3海尔的具体产品类->电视
1
2
3
4
5
6
7
8
9
10 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class ConcreteProduct2 implements Product2 {
4 @Override
5 public void show() {
6 System.out.println("海尔产出电视");
7 }
8}
9
10
4.3TCL
4.3.1TCL的具体工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class ConcreteFactory2 implements AbstractFactory {
4 @Override
5 public Product newProduct1() {
6 System.out.println("TCL->空调");
7 return new ConcreteProduct21();
8 }
9
10 @Override
11 public Product2 newProduct2() {
12 System.out.println("TCL->电视");
13 return new ConcreteProduct22();
14 }
15}
16
17
4.3.2TCL的具体产品类->空调
1
2
3
4
5
6
7
8
9
10 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class ConcreteProduct21 implements Product {
4 @Override
5 public void show() {
6 System.out.println("TCL产出空调");
7 }
8}
9
10
4.3.3TCL的具体产品类->电视
1
2
3
4
5
6
7
8
9
10 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class ConcreteProduct22 implements Product2 {
4 @Override
5 public void show() {
6 System.out.println("TCL产出电视");
7 }
8}
9
10
4.4测试
4.4.1海尔测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class Test {
4 public static void main(String[] args) throws Exception {
5 AbstractFactory abstractFactory ;
6 Product product1;
7 Product2 product2;
8
9 //Class<?> concreteFactory = Class.forName("ConcreteFactory");
10 //abstractFactory= (AbstractFactory)concreteFactory.newInstance();
11 abstractFactory = new ConcreteFactory();
12 abstractFactory.newProduct1().show();
13 abstractFactory.newProduct2().show();
14 }
15}
16
17
运行效果
4.4.2TCL测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 1package ink.poesy.design.AbstractFactoryDesign;
2
3public class Test {
4 public static void main(String[] args) throws Exception {
5 AbstractFactory abstractFactory ;
6 Product product1;
7 Product2 product2;
8
9 //Class<?> concreteFactory = Class.forName("ConcreteFactory");
10 //abstractFactory= (AbstractFactory)concreteFactory.newInstance();
11 只是修改这里为TCL具体工厂
12 abstractFactory = new ConcreteFactory2();
13 abstractFactory.newProduct1().show();
14 abstractFactory.newProduct2().show();
15 }
16}
17
18
运行结果
5.参考文章
[1].C语言中文网
本文为学习笔记来源整理自网络,如有侵犯留言联系。
以上内容如有争议、指正,留言给我~