简介
- 抽象工厂模式:对不同构建产品的工厂,再进行抽象的工厂。
应用场景
- 一个系统由多个产品系列中的一个来配置时。
- 一个系统要独立于它的产品的创建,组合和表示。
- 当你强调一系列相关的产品对象的设计以便联合使用时。(需要对产品的工厂进行再进行抽象,形成抽象工厂)
- 当你提供的产品类库,而只是想显示他们的接口而不是实现时候。
意图
- 创建一系列相关或相互依赖的接口,而不需要指定具体的类
参与者
- AbstractFactory:创造抽象的产品对象的操作接口
- ConcreteFactory:实现具体创造抽象的产品对象操作
- AbstractProduct:为产品对象声明抽象接口
- ConcreteProduct:实现抽象产品接口的对象
- Client:仅使用AbstractFactory和AbstractProduct抽象接口
结构
协作
- 通常在运行时刻创建一个具体工厂ConcreteFactory的实例,这个对象具有实现特定具体的产品对象。
- AbstractFactory将产品对象的创建延迟到他的ConcreteFactory的子类上。
效果
AbstractFactory工厂模式优缺点
- 它分离具体的实现类
- 它使得易于交换产品系列。(场景:一个具体工厂类在应用中仅出现一次)
- 它有利于产品的一致性。
- 难以支持新的产品。
实例
场景:鼠标,键盘为产品,惠普,戴尔为工厂。
需求:客户购买不同产品,产品是由不同的工厂创造的,不同的工厂生产不同的产品。
(1)键盘产品抽象类
/**
* 键盘产品的抽象类
* Created by shixinshan on 2018/10/25.
*/
public abstract class keybo {
public abstract String sayHi();
}
(2)鼠标产品的抽象类
public abstract class Mouse {
public abstract String sayHi();
}
(3)键盘产品具体实现类
惠普键盘产品
public class DellKeybo extends keybo {
@Override
public String sayHi() {
return "I am a dell keybo";
}
}
戴尔键盘产品
public class DellKeybo extends keybo {
@Override
public String sayHi() {
return "I am a dell keybo";
}
}
(4)鼠标产品具体实现类
惠普鼠标
public class HpMouse extends Mouse {
@Override
public String sayHi() {
return "I am Hp mouse";
}
}
戴尔鼠标
public class DellMouse extends Mouse {
@Override
public String sayHi() {
return "I am dell mouse";
}
}
(5)抽象工厂类
public abstract class AbstractFactory {
public abstract keybo createKeybo();
public abstract Mouse createMouse();
}
(5)实现抽象工厂类的具体工厂类
惠普工厂
public class HpFactory extends AbstractFactory {
@Override
public keybo createKeybo() {
return new HpKeybo();
}
@Override
public Mouse createMouse() {
return new HpMouse();
}
}
戴尔工厂
public class DellFactory extends AbstractFactory {
@Override
public keybo createKeybo() {
return new DellKeybo();
}
@Override
public Mouse createMouse() {
return new DellMouse();
}
}
测试
@Test
public void abstractFactory() throws Exception {
AbstractFactory dellfactory = new DellFactory();
keybo keybo = dellfactory.createKeybo();
System.out.println("keybo :"+ keybo.sayHi());
AbstractFactory hpfactory = new HpFactory();
Mouse mouse = hpfactory.createMouse();
System.out.println("mouse :"+mouse.sayHi());
}
结果
keybo :I am a dell keybo
mouse :I am Hp mouse
Process finished with exit code 0