利用超级工厂来创建各自的产品工厂;将一系列的产品统一到一起创建,但由于超级工厂创建的时候就规定了产品集的种类,所以后期扩展新的产品会比较麻烦
流程图
也许不好理解,反正我第一次捋这张图也捋了挺久
主要在于理解四个关键词:抽象产品、具体产品、抽象工厂(超级工厂)、具体工厂(生产工厂)
1、抽象产品决定抽象工厂:多少种抽象产品就有多少条抽象生产线
2、抽象产品和不同用户决定具体产品:抽象产品A类和不同用户B,具体产品类有A*B这么多(因为每个用户的抽象产品实现出来都不一样)
3、抽象工厂和不同用户决定具体工厂:不同用户都有各自的生产工厂,通过继承抽象工厂建造生产线,在用生产线创造具体产品
可实际上不同用户并不重要,仅仅是来区分不同的具体产品和具体工厂
步骤
第一步:抽象产品接口规定产品(猫有这些特点,狗有那些特点)、超级工厂接口规定生产线(宠物店有猫和狗买)
interface Cat { //猫接口:名字、叫、高度、抓老鼠(产品一)
void Name();
void Call();
void High();
void Kill();
}
interface Dog { //狗接口:名字、叫、重量、看门(产品二)
void Name();
void Call();
void Weight();
void LookDool();
}
interface PetShop { //宠物店:超级工厂,规定生产线
Cat Cat();
Dog Dog();
}
第二步:具体产品类(不同用户的同一产品是不同的,小王喜欢的猫和小李喜欢的猫是不同的,所以两个人两个动物就会有四个具体产品类)
class wangCat implements Cat { //小王的猫
@Override
public void Name() {
System.out.println("小王的猫");
}
@Override
public void Call() {
System.out.println("一次喵一声");
}
@Override
public void High() {
System.out.println("身高30厘米");
}
@Override
public void Kill() {
System.out.println("一天抓一只老鼠");
}
}
class liCat implements Cat { //小李的猫
@Override
public void Name() {
System.out.println("小李的猫");
}
@Override
public void Call() {
System.out.println("一次喵两声");
}
@Override
public void High() {
System.out.println("身高40厘米");
}
@Override
public void Kill() {
System.out.println("一天抓两只老鼠");
}
}
class wangDog implements Dog { //小王的狗
@Override
public void Name() {
System.out.println("小王的狗");
}
@Override
public void Call() {
System.out.println("一次汪一声");
}
@Override
public void Weight() {
System.out.println("体重10千克");
}
@Override
public void LookDool() {
System.out.println("看门一小时");
}
}
class liDog implements Dog { //小李的狗
@Override
public void Name() {
System.out.println("小李的狗");
}
@Override
public void Call() {
System.out.println("一次汪两声");
}
@Override
public void Weight() {
System.out.println("体重20千克");
}
@Override
public void LookDool() {
System.out.println("看门两小时");
}
}
第三步:具体工厂实现抽象工厂接口,并重写方法进行实例化(小王和小李都去宠物店买猫和狗,在这里猫和狗才是真的买到了)
class xiaowang implements PetShop { //小王去宠物店买猫和狗:工厂继承超级工厂
@Override
public Cat Cat() {
return new wangCat();
}
@Override
public Dog Dog() {
return new wangDog();
}
}
class xiaoli implements PetShop { //小李去宠物店买猫和狗:工厂继承超级工厂
@Override
public Cat Cat() {
return new liCat();
}
@Override
public Dog Dog() {
return new liDog();
}
}
第四步:可以看到,Main方法里new出对应工厂类(实现类)时,就可以决定创建哪一个产品了,比如图中小王就可以买一只猫或者一只狗,而且买了猫之后,也可以查看猫的相关属性和方法