抽象工厂模式

抽象工厂模式是一个比较常用的设计模式,它的英文原话是:

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

意思是:为创建一组相关和相互依赖的对象提供一个接口,而且无须指定它们的具体类。

抽象工厂模式的UML图如下


涉及到4个对象:

抽象工厂角色,该角色是抽象工厂模式的核心,与应用系统无关。

具体工厂角色:需要实现抽象工厂接口,含有相应的对象选择逻辑,并接受应用调用以创建产品对象。

抽象产品角色:该角色定义某类产品的共性,是产品的抽象定义。

具体产品角色:实现抽象产品角色接口,抽象工厂模式锁创建的任何产品对象都是具体产品角色的一个实例。


抽象工厂模式的一个应用

现有手机和电脑两款产品,Apple公司生产iphone和MacBook,Samsung公司生产Galaxy和Samsung牌电脑。

现在需要手机和电脑一套装备,而且不希望出现混搭的情况,也就是说具体的手机产品和电脑产品是相互依赖的,如iphone配Mac,galaxy配Samsung

如果采用之前的工厂方法模式很容易出错(产生混搭的情况),抽象工厂模式则可以解决掉对象之间的这种约束关系。


用例的UML图形如下:


代码如下:

抽象产品接口Phone:

public interface Phone {

	public void use();
	
}

抽象产品接口Computer

public interface Computer {

	public void use();
	
}

具体产品角色IPhone

public class IPhone implements Phone {

	@Override
	public void use() {
		System.out.println("This is a iphone");
	}
	
}

具体产品角色MacBook

public class MacBook implements Computer{

	@Override
	public void use() {
		System.out.println("This is a apple computer.");
	}
	
}

具体产品角色Galaxy5

public class Galaxy5 implements Phone {

	@Override
	public void use() {
		System.out.println("This is a samsung phone");
	}
	
}

具体产品角色SamsungComputer

public class SamsungComputer implements Computer {

	@Override
	public void use() {
		System.out.println("This is a samsung computer.");
	}
	
	
}

核心抽象工厂角色AbstractFactory

public interface AbstractFactory {

	public Phone createPhone();
	
	public Computer createComputer();
	
}

具体工厂角色AppleFactory

public class AppleFactory implements AbstractFactory {

	@Override
	public Computer createComputer() {
		return new MacBook();
	}
	
	@Override
	public Phone createPhone() {
		return new IPhone();
	}
	
}

具体工厂角色SamsungFactory

public class SamsungFactory implements AbstractFactory {

	@Override
	public Computer createComputer() {
		return new SamsungComputer();
	}
	
	@Override
	public Phone createPhone() {
		return new Galaxy5();
	}
	
}

客户端调用测试类:

public class Client {

	public static void main(String[] args) {
		AbstractFactory af = new AppleFactory();
		Phone iphone = af.createPhone();
		Computer mac = af.createComputer();
		iphone.use();
		mac.use();
		
		System.out.println("-----------------------");
		
		AbstractFactory sf = new SamsungFactory();
		Phone s5 = sf.createPhone();
		Computer samsung = sf.createComputer();
		s5.use();
		samsung.use();
		
	}
}

抽象工厂模式的优点

抽象工厂模式是工厂方法模式的进一步抽象,针对的是一族产品。如果产品中只有一种产品,则抽象工厂模式就退化成工厂方法模式。

除了工厂方法模式具有的优点外,抽象工厂模式还具有以下优点:

  • 产品族内的约束是不可见的,在不同的工厂中,各种产品之间可能存在不同的依赖关系,这些依赖关系由工厂封装在工厂的内部,对工厂的使用者是不可见的;
  • 产品线的扩展非常容易,如果针对同一产品族建立新的生产线(如再加入一个联想手机和电脑的生产线),只需要实现产品族中所有的接口并建立新的工厂类即可。

缺点:产品族本身的扩展比较困难,如果需要在产品族中增加一个新的产品类型(如果需要生产耳机产品),那么就需要修改多个接口,并且会影响到现有的工厂类。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值