抽象工厂模式(Abstract factory pattern)提供了一系列相关或者相互依赖的对象的接口,关键字是“一系列”。
优点:
1、具体产品从客户端代码中抽离出来,解耦。
2、将一个系列的产品族统一到一起创建。
缺点:
拓展新的功能困难,需要修改抽象工厂的接口;
综上所述,抽象工厂模式适合那些功能相对固定的产品族的创建。
举例:
1、新建水果抽象类Fruit,包含buy抽象方法:
public abstract class Fruit {
public abstract void buy();
}
2、新建价格抽象类Price,包含pay抽象方法:
public abstract class Price {
public abstract void pay();
}
3、新建水果创建工厂接口FruitFactory,包含获取水果和价格抽象方法(产品族的体现是,一组产品包含水果和对应的价格):
public interface FruitFactory {
Fruit getFruit();
Price getPrice();
}
4、接下来开始创建苹果这个“产品族”。
(1)新建Fruit实现类AppleFruit:
public class AppleFruit extends Fruit {
@Override
public void buy() {
System.out.println("買蘋果");
}
}
(2)新建对应的苹果价格实现ApplePrice:
public class ApplePrice extends Price {
@Override
public void pay() {
System.out.println("蘋果單價兩元");
}
}
5、新建FruitFactory的实现类AppleFruitFactory,包括:
public class AppleFruitFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new AppleFruit();
}
@Override
public Price getPrice() {
return new ApplePrice();
}
}
6、创建客户端Application,测试一波:
import com.fiber.wipe.Abstractfactorymode.dao.AppleFruitFactory;
import com.fiber.wipe.Abstractfactorymode.dao.FruitFactory;
public class TestApplication {
public static void main(String[] args) {
FruitFactory appleFruitFactory = new AppleFruitFactory();
appleFruitFactory.getFruit().buy();
appleFruitFactory.getPrice().pay();
}
}
7、结构:
8、UML展示
9、
客户端只需要通过创建AppleFruitFactory就可以获得苹果这个产品族的所有内容,包括苹果对象,苹果价格。要新建香蕉的产品族,只需要实现FruitFactory、Price和Fruit接口即可。这种模式的缺点和工厂方法差不多,就是类的个数容易过多,增加复杂度。
public class BananaFruit extends Fruit {
@Override
public void buy() {
System.out.println("買香蕉");
}
}
public class BananaPrice extends Price {
@Override
public void pay() {
System.out.println("香蕉單價一元");
}
}
public class BananaFruitFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new BananaFruit();
}
@Override
public Price getPrice() {
return new BananaPrice();
}
}
import com.fiber.wipe.Abstractfactorymode.dao.AppleFruitFactory;
import com.fiber.wipe.Abstractfactorymode.dao.BananaFruitFactory;
import com.fiber.wipe.Abstractfactorymode.dao.FruitFactory;
public class TestApplication {
public static void main(String[] args) {
FruitFactory appleFruitFactory = new AppleFruitFactory();
appleFruitFactory.getFruit().buy();
appleFruitFactory.getPrice().pay();
FruitFactory bananaFruitFactory = new BananaFruitFactory();
bananaFruitFactory.getFruit().buy();
bananaFruitFactory.getPrice().pay();
}
}
10、结果