上一篇:设计模式(一)——工厂模式

下一篇:设计模式(三)——单例模式

一、概述

官方解释:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。)

我的理解:抽象工厂模式,即实现了工厂本身的抽象化。在工厂模式上更进一步,不仅解决工厂产品的向上转型,还体现工厂本身的向上转型。

第一步,有一个抽象工厂,在工厂创建类中根据形参确定运行时类型,新建并返回各个具体工厂;

第二步,由每个工厂负责对应的抽象产品,对于任意一个抽象产品,再由工厂类中的产品创建类根据形参确定运行时类型,新建并返回各个具体产品。

(其中第二步就是上一篇的工厂模式)

工厂模式与抽象工厂模式
工厂模式 抽象产品
抽象工厂模式 抽象工厂+抽象产品

参与者:产品类(抽象产品类AbstractProduct、具体产品类ConcreteProduct)、工厂类(抽象工厂类AbstractFactory、具体工厂类ConcreteFactory)

类图:

设计模式(二)——抽象工厂模式_# (0)设计模式

二、代码

具体类图

 

设计模式(二)——抽象工厂模式_设计模式_02

代码示意


interface Fruit{
	public void display();
}
class Apple implements Fruit{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("This is an Apple");
	}
	
}
class Orange implements Fruit{

	@Override
	public void display() {
		System.out.println("This is an orange");
		
	}
	
}
class Banana implements Fruit{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("This is a banana");
	}
	
}
interface Vegetable {
	public void display();
}
class Potato implements Vegetable{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("This is a Potato");
	}
	
}
class Tomato implements Vegetable{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("This is a Tomato");
	}
	
}
class Cabbage implements Vegetable{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("This is a Cabbage");
	}
	
}
abstract class AbstarctFactory{
	abstract Fruit produce_Fruit(String type);
	abstract Vegetable produce_Vegetable(String type);
}
class FruitFactory extends AbstarctFactory{
	public Fruit produce_Fruit(String type){
		//工厂模式的精髓在于   工厂类的工厂方法中根据参数 ,新建不同工厂产品,   其中运用到多态
		if (type.equalsIgnoreCase("apple")) {
			return new Apple();
		}
		if (type.equalsIgnoreCase("orange")) {
			return new Orange();
		}
		if (type.equalsIgnoreCase("banana")) {
			return new Banana();
		}
		return null;
	}

	@Override
	Vegetable produce_Vegetable(String type) {
		// TODO Auto-generated method stub
		return null;
	}
}
class VegetableFactory extends AbstarctFactory{

	@Override
	Fruit produce_Fruit(String type) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	Vegetable produce_Vegetable(String type) {
		if (type.equalsIgnoreCase("Potato")) {
			return new Potato();
		}
		if (type.equalsIgnoreCase("Tomato")) {
			return new Tomato();
		}
		if (type.equalsIgnoreCase("Cabbage")) {
			return new Cabbage();
		}
		return null;
	}
	
}
public class TestAbstractFactory {

	public static void main(String[] args) {
		System.out.println("=====水果工厂=====");
		AbstarctFactory _fruit_factory=new FruitFactory();
		_fruit_factory.produce_Fruit("apple").display();
		_fruit_factory.produce_Fruit("orange").display();
		_fruit_factory.produce_Fruit("banana").display();
		System.out.println("=====蔬菜工厂=====");
		AbstarctFactory _vegetable_factory=new VegetableFactory();
		_vegetable_factory.produce_Vegetable("potato").display();
		_vegetable_factory.produce_Vegetable("tomato").display();
		_vegetable_factory.produce_Vegetable("cabbage").display();
	}

}

输出:

=====水果工厂=====
This is an Apple
This is an orange
This is a banana
=====蔬菜工厂=====
This is a Potato
This is a Tomato
This is a Cabbage

三、小结

      抽象工厂模式不仅完成对产品的抽象化,更新增对工厂的抽象化处理,学习抽象工厂模式可以加强我们面向对象的理解,熟练的使用抽象工厂模式可以让开发事半功倍。

 

上一篇:设计模式(一)——工厂模式

下一篇:设计模式(三)——单例模式