什么是抽象工厂方法模式
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
上一节的工厂方法模式中考虑的是一类产品的生产,如鱼塘里面只养鱼,Shape下面只有圆形、正方形等。在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调。
模式角色
1.抽象工厂(AbstractFactory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
2.具体工厂(HuaWeiFactory,AppleFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3.抽象产品(Phone,Laptop):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4.具体产品(HuaWeiPhone,HuaWeiLaptop,IPhone,MacLaptop):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
UML类图

代码实现
public abstract class AbstractFactory {
/**
* 删除笔记本电脑
* @return
*/
public abstract Laptop produceLaptop();
/**
* 生成手机
* @return
*/
public abstract Phone producePhone();
}
public class AppleFactory extends AbstractFactory {
@Override
public Laptop produceLaptop() {
return new MacLaptop();
}
@Override
public Phone producePhone() {
return new IPhone();
}
}
public class HuaWeiFactory extends AbstractFactory {
@Override
public Laptop produceLaptop() {
return new HuaWeiLaptop();
}
@Override
public Phone producePhone() {
return new HuaWeiPhone();
}
}
public abstract class Phone {
public abstract void phoneName();
}
public abstract class Laptop {
public abstract void laptopName();
}
public class HuaWeiPhone extends Phone {
@Override
public void phoneName() {
System.out.println("华为手机产品");
}
}
public class IPhone extends Phone {
@Override
public void phoneName() {
System.out.println("苹果手机产品");
}
}
public class HuaWeiLaptop extends Laptop {
@Override
public void laptopName() {
System.out.println("华为笔记本产品");
}
}
public class MacLaptop extends Laptop {
@Override
public void laptopName() {
System.out.println("苹果笔记本产品");
}
}
public class TestAbstractFactory {
public static void main(String[] args) {
AbstractFactory appleFactory = new AppleFactory();
AbstractFactory huaWeiFactory = new HuaWeiFactory();
Phone applePhone = appleFactory.producePhone();
applePhone.phoneName(); // 苹果手机产品
Laptop appleLaptop = appleFactory.produceLaptop();
appleLaptop.laptopName(); // 苹果笔记本产品
Phone huaWeiPhone = huaWeiFactory.producePhone();
huaWeiPhone.phoneName(); // 华为手机产品
Laptop huaWeiLaptop = huaWeiFactory.produceLaptop();
huaWeiLaptop.laptopName(); // 华为笔记本产品
}
}
优点
它让具体的创建实例过和客户端分离,不关心创建细节;将一系列的产品族对象统一在一起创建。当增加一个新的产品族时不需要修改原代码,满足开闭原则。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,所有的工厂类都需要进行修改。
网友评论