设计模式之抽象工厂模式(3)

 抽象工厂模式
在工厂方法模式中具体工厂负责生产具体的产品, 每一个具体工厂对应一种具体产品但是有
时候我们希望一个工厂可以提供多个产品对象, 而不是单一的产品对象, 如一个电器工厂,
它可以生产电视机、 电冰箱、 空调等多种电器, 而不是只生产某一种电器。 为了更好地理解
抽象工厂模式, 我们先引入两个概念:

(1) 产品等级结构: 产品等级结构即产品的继承结构, 如一个抽象类是电视机, 其子类有海尔
电视机、 海信电视机、 TCL电视机, 则抽象电视机与具体品牌的电视机之间构成了一个产品等
级结构, 抽象电视机是父类, 而具体品牌的电视机是其子类。
(2) 产品族: 在抽象工厂模式中, 产品族是指由同一个工厂生产的, 位于不同产品等级结构中
的一组产品, 如海尔电器工厂生产的海尔电视机、 海尔电冰箱, 海尔电视机位于电视机产品
等级结构中, 海尔电冰箱位于电冰箱产品等级结构中, 海尔电视机、 海尔电冰箱构成了一个
产品族。

 

 
通过一个代码案例来学习下抽象工厂模式:

一:先用工厂方法模式实现下
1.1抽象产品

//抽象产品
public interface Button {
	
	void display();
}
//抽象产品
public interface TextField {
	void display();
}


1.2具体产品

//具体产品
public class SpringButton implements Button{

	@Override
	public void display() {
		System.out.println("显示浅绿色按钮");
	}

}
//具体产品
public class SummerButton implements Button{

	@Override
	public void display() {
		System.out.println("显示浅蓝色按钮");
	}

}


1.3抽象工厂

//抽象工厂: 是创建抽象产品的
public interface ButtonFactory {
	Button createButton();
}


1.4具体工厂

//具体工厂: 在工厂方法模式下,具体只创建一种产品!
public class SpringButtonFactory implements ButtonFactory{

	@Override
	public Button createButton() {
		return new SpringButton();
	}

}
public class SummerButtonFactory implements ButtonFactory{

	@Override
	public Button createButton() {
		return new SummerButton();
	}

}

UML类图:

只写了Button一系列的,设想如果我突然想加ComboBox(组合框) 了,要么如果使用“工厂方法模式”,
要得像上面UML类图一样写 1(抽象产品) + 2(具体产品) + 1(抽象工厂) + 2(具体工厂) = 6,也就是说一旦要扩展的话
要写6个类,这是多么的麻烦,就只关于这点用工厂方法模式实现就可以说不是很好的实现方式!

二:使用抽象工厂模式
抽象工厂模式像是工厂方法模式的升级版

大致思想差不多:
抽象工厂模式 和 工厂方法模式比较:就是具体工厂不是创建一个具体产品,而是创建一个产品族的产品

工厂方法模式: 
    手机工厂 --》 只是生产手机的(包括小米,apple)
    电脑工厂 --》 只是生产电脑的 (包括华硕,apple)
    就是一个具体工厂生产一种产品

    角色如下:
    抽象产品
    具体产品
    抽象工厂
    具体工厂:对应一种产品

抽象工厂模式:
    电器工厂 --》 它会生产一系列的电器产品(产品族): 电脑,电视机,冰箱....
    就是一个具体工厂生产一种产品族!

    抽象产品
    具体产品
    抽象工厂:抽象工厂就是创建抽象产品的!
    具体工厂:对应一种产品族

知道上面的概念后,我们使用“抽象工厂模式”对之前的代码重构
2.1抽象产品

//抽象产品
public interface Button {
	
	void display();
}


2.2具体产品

//具体产品
public class SpringButton implements Button{

	@Override
	public void display() {
		System.out.println("显示浅绿色按钮");
	}

}


2.3抽象工厂

//抽象工厂: 在抽象工厂模式中,创建一种产品族
public interface SkinFactory {

	Button createButton();
	TextField createTextField();
}


2.4具体工厂

public class SpringSkinFactory implements SkinFactory{

	@Override
	public Button createButton() {
		return new SpringButton();
	}

	@Override
	public TextField createTextField() {
		return new SpringTextField();
	}

}

2.5 测试代码

public class Client {

	public static void main(String[] args) {
		
		//抽象工厂
		SkinFactory factory;
		//抽象产品
		Button button;
		TextField field;
		
		//具体工厂
		factory = new SpringSkinFactory();
		//具体产品
		button = factory.createButton();
		field = factory.createTextField();
		
		button.display();
		field.display();
		
	}
}

UML类图:

如果使用工厂方法模式完成:会产生6个具体工厂
而使用抽象工厂模式完成:会产生2个具体工厂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章