java设计模式——Abstract Factory模式
1、Abstract Factory(抽象工厂)模式简介
抽象工厂模式:相对于builder(建造者)模式来说,抽象工厂模式是围绕一个超级工厂创建其他工厂,而非在一个工厂内去定义他需要哪些具体功能。在抽象工厂模式中,可以根据不同的接口来区分超级工厂下不同的工厂。
意图:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
使用的场景:系统的产品有多于一个的产品族,而系统只使用其中某一族的产品。以鱼来举例子。鱼就相当于是一个系统,而该系统中又分为淡水鱼和海鱼两个产品族。而对于这两个产品族又都包含大鱼和小鱼这两个产品。而当我们要创建淡水大鱼的时候,我们并不需要知道如何创建这个对象,只需要调用淡水鱼中创建大鱼类的方法就可以。
2、角色定义
抽象工厂类:核心,定义用于生成抽象产品的接口。
抽象产品类:各种产品的抽象接口或抽象类。
具体工厂类:实现抽象工厂中的方法,生成一组具体产品。(生成的是一组产品,也即前文中的超级大厂里的各个工厂)但是我们可以根据需要选择只生成其中的某一产品。
具体产品类:实现抽象产品的接口的类。
3、代码呈现
步骤一:创建抽象工厂类
interface fAbstractFactory{ 将鱼统分为大鱼和小鱼。所以在这个超级工厂里只需要知道有这两大类
public Bfish createBfish(String name);
public Sfish createSfish(String name);
}
步骤二:创建抽象产品类
interface Bfish{
void printName();
}
interface Sfish{
void printName();
}
步骤三:创建具体工厂类
我将大鱼和小鱼又分别细分为淡水鱼和海鱼。作为一个产品族里的两个子产品
class FreshwaterFactory implements fAbstractFactory{ 淡水鱼工厂(产品1)
public Bfish createBfish(String name) { 创建淡水大鱼
return new FreshwaterBFish(name);
}
public Sfish createSfish(String name) { 创建淡水小鱼
return new FreshwaterSFish(name);
}
}
class SeaFactory implements fAbstractFactory{ 海鱼工厂(产品2)
public Bfish createBfish(String name) { 创建海水大鱼
return new SeaBFish(name);
}
public Sfish createSfish(String name) { 创建海水小鱼
return new SeaSFish(name);
}
}
步骤四:创建具体产品类
class FreshwaterBFish implements Bfish{
private String name;
public FreshwaterBFish(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void printName() {
System.out.println("淡水"+this.name);
}
}
class SeaBFish implements Bfish{
private String name;
public SeaBFish(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void printName() {
System.out.println("海水"+this.name);
}
}
class FreshwaterSFish implements Sfish{
private String name;
public FreshwaterSFish(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void printName() {
System.out.println("淡水"+this.name);
}
}
class SeaSFish implements Sfish{
private String name;
public SeaSFish(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void printName() {
System.out.println("海水"+this.name);
}
}
测试:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
fAbstractFactory FreshwaterFactory = new FreshwaterFactory();
Bfish fish1 = FreshwaterFactory.createBfish("大鱼1");
Sfish fish2 = FreshwaterFactory.createSfish("小鱼2");
fish1.printName();
fish2.printName();
fAbstractFactory SeaFactory = new SeaFactory();
Bfish fish3 = SeaFactory.createBfish("大鱼3");
Sfish fish4 = SeaFactory.createSfish("小鱼4");
fish3.printName();
fish4.printName();
}
}
淡水大鱼1
淡水小鱼2
海水大鱼3
海水小鱼4
4、总结
使用抽象工厂模式来设计系统的时候,系统独立于它的产品的创建、组合和表示。但是当想要扩展该系统中的产品的时候,需要修改其下的每一个产品也即要修改每一个子类。
和builder(建造者)模式做比较,抽象工厂模式更注重创造的结果。因此在抽象工厂类中重点返回的是一个实例。而builder模式更注重创建东西的过程。