【设计模式】14-抽象工厂模式

目录

 

什么是抽象工厂模式

为什么要用抽象工厂模式

抽象工厂模式组成

需要注意的几点


什么是抽象工厂模式

抽象工厂模式是针对多种抽象对象统一使用的创建模式,使得客户端可以在不指定具体产品的情况下,创建具体对象。

 

为什么要用抽象工厂模式

抽象工厂模式具有良好的封装性,使得客户端高层不必关心具体的对象是如何创建的,只需要知道通过哪个工厂类来创建。而具体的对象创建逻辑交给具体的工厂类就好了。

 

抽象工厂模式组成

抽象产品
public abstract class AbstractProduct {
	public abstract void display();

	public abstract void foo();
}

 

抽象产品A
public abstract class AbstractProductA extends AbstractProduct {

	@Override
	public void display() {
		System.out.println("A display");
	}
}

 

抽象产品B
public abstract class AbstractProductB extends AbstractProduct {

	@Override
	public void display() {
		System.out.println("B display");
	}
}

 

具体产品A1
public class ProductA1 extends AbstractProductA{
	@Override
	public void foo() {
		System.out.println("Product A1 Method foo");
	}
}

 

具体产品A2
public class ProductA2 extends AbstractProductA{
	@Override
	public void foo() {
		System.out.println("Product A2 Method foo");
	}
}

 

具体产品B1
public class ProductB1 extends AbstractProductB{
	@Override
	public void foo() {
		System.out.println("Product B1 Method foo");
	}
}

 

具体产品B2
public class ProductB2 extends AbstractProductB{
	@Override
	public void foo() {
		System.out.println("Product B2 Method foo");
	}
}

 

抽象工厂类
public abstract class AbstractFactory {
	public abstract AbstractProductA createProductA();

	public abstract AbstractProductB createProductB();
}

 

具体工厂类1
public class Creator1 extends AbstractFactory {
	@Override
	public AbstractProductA createProductA() {
		return new ProductA1();
	}

	@Override
	public AbstractProductB createProductB() {
		return new ProductB1();
	}
}

 

具体工厂类2
public class Creator2 extends AbstractFactory {
	@Override
	public AbstractProductA createProductA() {
		return new ProductA2();
	}

	@Override
	public AbstractProductB createProductB() {
		return new ProductB2();
	}
}

 

测试驱动
public class Main {

	public static void main(String[] args) {
		AbstractFactory f1 = new Creator1();
		AbstractFactory f2 = new Creator2();

		AbstractProductA a1 = f1.createProductA();
		AbstractProductA a2 = f2.createProductA();

		AbstractProductB b1 = f1.createProductB();
		AbstractProductB b2 = f2.createProductB();

		a1.display();
		a1.foo();

		a2.display();
		a2.foo();

		b1.display();
		b1.foo();

		b2.display();
		b2.foo();
	}
}

 

需要注意的几点

从抽象工厂模式的组成上很容易的看出,如果需要对产品进行扩展是很困难的,比如说需要增加ProductC,那么就需要改造AbstractFactory 增加createProductC的方法。这样会带来子类工厂都需要改写。 虽然对产品的扩展是困难的,但是对产品型号的扩展却是很容易的,比如这里需要增加3这个产品型号,只需要对应的增加一个Creator3工厂即可,而无需改动其他。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值