01.抽象工厂模式——对象创建型模式
意图
提供一个接口以创建一系列相关或相互依赖的对象,而无需指定他们具体的类
适用性
- 一个系统要独立于它的产品的创建、组合和表示
- 一个系统要由多个产品系列中的一个来配置
- 要强调一系列相关的产品对象的设计以便进行联合使用
- 提供一个产品类库,但只想显示他们的接口而不是实现
结构
参与者
-
Abstract Factory
声明一个创建抽象产品对象的操作接口
-
Concrete Factory
实现创建具体产品对象的操作
-
Abstract Product
为一类产品对象声明一个接口
-
Concrete Product
定义一个将要被相应的具体工厂创建的产品对象并实现Abstract Product接口
-
Client
仅适用由Abstract Factory和Abstract Product类声明的接口
效果
实现
基本思路
我们考虑每个人穿衣服和穿裤子两项最基本的操作对抽象工厂模式进行一个具体的实现。
基本结构
具体实现
Abstract Factory类
public abstract class AbstractFactory {
public abstract Clothes getClothes(String order);
public abstract Trousers getTrousers(String order);
}
Clothes Factory类
public class ClothesFactory extends AbstractFactory{
@Override
public Clothes getClothes(String order) {
// TODO Auto-generated method stub
if (order.equalsIgnoreCase("JACKET")) {
return new Jacket();
}
else if (order.equalsIgnoreCase("SWEATER")) {
return new Sweater();
}
else if (order.equalsIgnoreCase("SHIRT")) {
return new Shirt();
}
else {
return null;
}
}
@Override
public Trousers getTrousers(String order) {
// TODO Auto-generated method stub
return null;
}
}
Trousers Factory类
public class TrousersFactory extends AbstractFactory{
@Override
public Clothes getClothes(String order) {
// TODO Auto-generated method stub
return null;
}
@Override
public Trousers getTrousers(String order) {
// TODO Auto-generated method stub
if (order.equalsIgnoreCase("JEAN")) {
return new Jean();
}
else if (order.equalsIgnoreCase("OVERALL")) {
return new Overall();
}
else if (order.equalsIgnoreCase("SLACK")) {
return new Slacks();
}
else {
return null;
}
}
}
Clothes接口
public interface Clothes {
public void dressClothes();
}
Jacket类对Clothes接口进行具体实现
public class Jacket implements Clothes{
@Override
public void dressClothes() {
// TODO Auto-generated method stub
System.out.println("Jacket Dressed!");
}
}
程序主入口
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractFactory clothesFactory = new ClothesFactory();
AbstractFactory trousersFactory = new TrousersFactory();
Clothes clothes = clothesFactory.getClothes("jacket");
Trousers trousers = trousersFactory.getTrousers("overall");
clothes.dressClothes();
trousers.dressTrousers();
}
}
程序主入口
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractFactory clothesFactory = new ClothesFactory();
AbstractFactory trousersFactory = new TrousersFactory();
Clothes clothes = clothesFactory.getClothes("jacket");
Trousers trousers = trousersFactory.getTrousers("overall");
clothes.dressClothes();
trousers.dressTrousers();
}
}