-- 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂(产品等级结构)创建其他工厂(产品族)。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
--在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
如图:
一、结构
组成(角色) | 作用 |
---|---|
抽象产品(Product) | 列出所有模糊产品 |
产品族模糊产品(Fuzzy Product) | 提供具体产品功能 |
具体产品(Concrete Product) | 描述生产的具体产品功能 |
抽象产品工厂(Creator) | 列出所有产品族 |
产品族工厂(Concrete Creator) | 提供该族里具体产品信息的接口 |
二、结构栗子
三、优缺点
1、优点
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
2、缺点
- 产品等级易扩展,但产品族难扩展,牵一发而动全身。
一、工厂角色
1、抽象产品工厂-列出所有产品
package com.AbstractFactory_03;
/**
* @Description: 抽象工厂
* @Author: ziHeng
* @Date: 2018/8/2 9:50 PM
* @Param:
* @return:
*/
public interface FruitFactory {
Fruit getApple();
Fruit getBanana();
}
2、产品族工厂
package com.AbstractFactory_03;
/**
* @description: 北方水果工厂
* @author: ziHeng
* @create: 2018-08-02 21:53
**/
public class NorthFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new NorthApple();
}
@Override
public Fruit getBanana() {
return new NorthBanana();
}
}
二、产品角色
1、产品角色接口
package com.AbstractFactory_03;
/**
* @description: 抽象产品角色-水果
* @author: ziHeng
* @create: 2018-08-02 14:31
**/
public interface Fruit {
void get();
}
2、模糊产品角色-苹果
package com.AbstractFactory_03;
/**
* @description: 模糊产品角色-苹果
* @author: ziHeng
* @create: 2018-08-02 14:30
**/
public abstract class Apple implements Fruit{
public abstract void get();
}
package com.AbstractFactory_03;
/**
* @description: 模糊产品角色-香蕉
* @author: ziHeng
* @create: 2018-08-02 14:31
**/
public abstract class Banana implements Fruit {
public abstract void get();
}
3、具体产品角色
package com.AbstractFactory_03;
/**
* @description: 北方苹果
* @author: ziHeng
* @create: 2018-08-02 22:00
**/
public class NorthApple extends Apple{
@Override
public void get() {
System.out.println("得到北方苹果");
}
}
package com.AbstractFactory_03;
/**
* @description: 北方香蕉
* @author: ziHeng
* @create: 2018-08-02 22:03
**/
public class NorthBanana extends Banana {
@Override
public void get() {
System.out.println("得到北方香蕉");
}
}
调用Test类:
package com.AbstractFactory_03;
/**
* @description: 调用者
* @author: ziHeng
* @create: 2018-08-02 22:04
**/
public class Test {
public static void main(String[] args) {
FruitFactory northFruitFactory = new NorthFruitFactory();
northFruitFactory.getApple().get();
northFruitFactory.getBanana().get();
}
}