【设计模式系列】--抽象工厂

在前面中,介绍过工厂方法模式,那么抽象工厂和工厂方法模式有哪些不一样呢?抽象工厂又可以解决什么样的问题呢?她在实际应用中又是如何发挥她的作用呢?今天这篇博文小编来主要简单的介绍一下抽象工厂模式,希望对有需要的小伙伴有帮助,不足之处,还请小伙伴多多指教。首先,我们来看一下什么是抽象工厂模式:
什么是抽象工厂?

抽象工厂模式是所有形态的工厂模式中最为抽象和最具其一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。简单来说就是,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。以之前的demo为例,拷贝Apple、Banana、Fruit,并且修改Apple和Banana的代码部分,如下所示,首先修改Apple的代码部分:

public abstract class Apple implements Fruit  {
	/**
	 * 采集
	 */
	public abstract void get();

}
Banana的代码部分,如下所示:

public abstract class Banana implements Fruit {
	/**
	 * 采集
	 */
	public abstract void get();
}
新建类NorthApple并继承Apple,编写代码如下所示:

public class NorthApple extends Apple {

	@Override
	public void get() {
		System.out.println("采集北方苹果");

	}

}
同样新建南方苹果类SouthApple,继承Apple类,并编写相关的代码部分,如下所示:

public class SouthApple extends Apple {

	@Override
	public void get() {
		System.out.println("采集南方苹果");

	}

}
同样新建NorthBanana和SouthBanana,代码类似NorthApple和SouthBanana,小编在这里就不一一进行介绍了,接着新建类FruitFactory,编写相关的代码部分,如下所示:

public interface FruitFactory {
	//实例化Apple
	public Fruit getApple();
	//实例化Banana
	public Fruit getBanana();

}
新建类NorthFruitFactory,编写相关代码部分,如下所示:

public class NorthFruitFactory implements FruitFactory {

	@Override
	public Fruit getApple() {
		return new NorthApple();

	}

	@Override
	public Fruit getBanana() {
		return new NorthBanana();

	}

}
同样的需要新建SouthFruitFactory,代码部分和NorthFruitFactory类似,不在赘述,新建类,MainClass,编写相关代码如下所示:
public class MainClass {
	public static void main(String[] args){
		FruitFactory ff = new NorthFruitFactory();
		Fruit apple = ff.getApple();
		apple.get();
		
		Fruit banana = ff.getBanana();
		banana.get();
		
		FruitFactory ff2 = new SouthFruitFactory();
		Fruit apple2 = ff2.getApple();
		apple2.get();
		
		Fruit banana2 = ff2.getBanana();
		banana2.get();
	}

}
接着,我们来运行一下,效果如下所示:


添加类WenshiApple类,并继承Apple类,编写代码如下所示:

public class WenshiApple extends Apple {

	@Override
	public void get() {
		System.out.println("采集温室苹果");

	}

}
同样的编写WenshiBanana,并继承Banana,编写相关代码和上述类似。

接着创建WenshiFruitFactory并实现FruitFactory,编写相关代码部分,如下所示:

public class WenshiFruitFactory implements FruitFactory {

	@Override
	public Fruit getApple() {
		return new WenshiApple();
	}

	@Override
	public Fruit getBanana() {
		return new WenshiBanana();
	}

}
编写MainClass里面的代码部分,如下所示:

public class MainClass {
	public static void main(String[] args){
		FruitFactory ff = new NorthFruitFactory();
		Fruit apple = ff.getApple();
		apple.get();
		
		Fruit banana = ff.getBanana();
		banana.get();
		
		FruitFactory ff2 = new SouthFruitFactory();
		Fruit apple2 = ff2.getApple();
		apple2.get();
		
		Fruit banana2 = ff2.getBanana();
		banana2.get();
		
		FruitFactory ff3 = new WenshiFruitFactory();
		Fruit apple3 = ff3.getApple();
		apple3.get();
		
		Fruit banana3 = ff3.getBanana();
		banana3.get();
		
	}

}
我们来看一下运行效果,如下所示:


模式中包含的角色及其职责

抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂(Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色
抽象模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色

抽象模式所创建的具体实例对象

小编寄语:该博文,小编主要介绍了抽象工厂,结合之前学习过的模式,我们发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

©️2020 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值