1.抽象工厂模式介绍
抽象工厂模式,也是创建型模式之一。2.抽象工厂模式的定义
为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类3.抽象工厂的使用场景
(1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。(2) 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
(3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
(4) 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
4.UML类图
5.工厂方法模式和抽象工厂模式的区别
5.1 工厂方法模式
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。5.2 抽象工厂模式
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。
5.3 区别
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。6.具体实现
现A商场和B商场两个商场做促销活动,他们促销的商品都有水果和饮料,促销商品列表该如何封装实现呢?不妨用抽象工厂模式试下,商场作为工厂,促销列表作为实体类。1.抽象工厂
/**
* 抽象工厂
* Created by Teaphy
* 2016/3/21.
*/
public abstract class Factory {
abstract Fruit createFruit();
abstract Drink createDrink();
}
2.具体工厂
/**
* 具体工厂实现类
* Created by Teaphy
* 2016/3/21.
*/
public class MarkAFactory extends Factory {
Fruit createFruit() {
return new AppleOfFruit("Mark_A_Factory");
}
Drink createDrink() {
return new CokeOfDrink("Mark_A_Factory");
}
}
/**
* 具体工厂实现类
* Created by Teaphy
* 2016/3/21.
*/
public class MarkBFactory extends Factory {
Fruit createFruit() {
return new BananaOfFruit("Mark_B_Factory");
}
Drink createDrink() {
return new SpriteOfDrink("Mark_B_Factory");
}
}
3.产品抽象类
/**
* 产品抽象类 - 水果
* Created by Teaphy
* 2016/3/21.
*/
public abstract class Fruit {
abstract void SpecialOffer();
}
/**
* 产品抽象类 - 饮料
* Created by Teaphy
* 2016/3/21.
*/
public abstract class Drink {
abstract void SpecialOffer();
}
4.具体产品类
/**
* 具体产品类 - 苹果
* Created by Teaphy
* 2016/3/21.
*/
public class AppleOfFruit extends Fruit {
private String fac;
public AppleOfFruit(String fac) {
this.fac = fac;
}
void SpecialOffer() {
System.out.println("BananaOfFruit - SpecialOffer : " + fac);
}
}
/**
* 具体产品类 - 香蕉
* Created by Teaphy
* 2016/3/21.
*/
public class BananaOfFruit extends Fruit {
private String fac;
public BananaOfFruit(String fac) {
this.fac = fac;
}
void SpecialOffer() {
System.out.println("BananaOfFruit - SpecialOffer :" + fac);
}
}
/**
* 具体产品类 - 可乐
* Created by Teaphy
* 2016/3/21.
*/
public class CokeOfDrink extends Drink{
private String fac;
public CokeOfDrink(String fac) {
this.fac = fac;
}
void SpecialOffer() {
System.out.println("CokeOfDrink - SpecialOffer : " + fac);
}
}
/**
* 具体产品类 - 雪碧
* Created by Teaphy
* 2016/3/21.
*/
public class SpriteOfDrink extends Drink{
private String fac;
public SpriteOfDrink(String fac) {
this.fac = fac;
}
void SpecialOffer() {
System.out.println("CokeOfDrink - SpecialOffer : " + fac);
}
}
5.测试类
/**
* 测试类
* Created by Teaphy
* 2016/3/21.
*/
public class TestAbstractfactory {
public static void main(String[] args) {
Factory markA = new MarkAFactory();
Fruit fruitA = markA.createFruit();
Drink drinkA = markA.createDrink();
fruitA.SpecialOffer();
drinkA.SpecialOffer();
Factory markB = new MarkBFactory();
Fruit fruitB = markB.createFruit();
Drink drinkB = markB.createDrink();
fruitB.SpecialOffer();
drinkB.SpecialOffer();
}
}
6.输出结果
AppleOfFruit - SpecialOffer : Mark_A_Factory
CokeOfDrink - SpecialOffer : Mark_A_Factory
BananaOfFruit - SpecialOffer :Mark_B_Factory
SpriteOfDrink - SpecialOffer : Mark_B_Factory
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。