定义
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
角色结构
- AbstractFactory:抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如上述类图中的
- AbstractFactory就定义了两个方法,分别创建产品A和产品B
- ConcreteFactory:具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生产一组具体产品,这饿产品构件成了一个产品种类,每一个产品都位于某个产品等级结构中,如上述类图中的ConcreteFactoryA和ConcreteFactoryB
- AbstractProduct:抽象产品角色,为每种产品声明接口,如图中AbstractProductA、AbstractProductB
- ConcreteProduct:具体产品角色,定义了工厂生产的具体产品对象,实现抽象产品接口声明的业务方法,如图中
ConcreteProductA1、ConcreteProductA2、ConcreteProductB1、ConcreteProductB2
优点
1、具体产品在应用层代码隔离,无须关系创建细节
2、将一个系列的产品统一到一起创建缺点
1、规定了所有可能被创建的产品集合,产品族扩展新的产品困难,需要修改抽象工厂的接口
2、增加了系统的抽象性和理解难度适用环境
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节<br /> 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品<br /> 同属于同一个产品族的产品是一起使用的,这一约束必须在系统的设计中体现出来<br /> 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现
示例
键盘接口
public interface Keybo {
void sayHi();
}
鼠标对象
public interface Mouse {
void sayHi();
}
戴尔工厂
public class DellFactory implements PCFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
@Override
public Keybo createKeybo() {
return new DellKeybo();
}
}
惠普工厂
```java public class HpFactory implements PCFactory {
@Override public Mouse createMouse() {
return new HpMouse();
}
@Override public Keybo createKeybo() {
return new HpKeybo();
} }
<a name="qQFVi"></a>
#### 戴尔键盘实现
```java
public class DellKeybo implements Keybo {
@Override
public void sayHi() {
System.out.println("DellKeybo.sayHi");
}
}
戴尔鼠标实现
public class DellMouse implements Mouse {
@Override
public void sayHi() {
System.out.println("DellMouse.sayHi");
}
}
惠普键盘实现
public class HpKeybo implements Keybo {
@Override
public void sayHi() {
System.out.println("HpKeybo.sayHi");
}
}
惠普鼠标实现
public class HpMouse implements Mouse {
@Override
public void sayHi() {
System.out.println("HpMouse.sayHi");
}
}
电脑工厂
public interface PCFactory {
Mouse createMouse();
Keybo createKeybo();
}
测试类
public class Test {
public static void main(String[] args) {
PCFactory dellFactory = new DellFactory();
dellFactory.createKeybo().sayHi();
dellFactory.createMouse().sayHi();
PCFactory hpFactory = new HpFactory();
hpFactory.createMouse().sayHi();
hpFactory.createKeybo().sayHi();
}
}