Press "Enter" to skip to content

设计模式—抽象工厂模式

我在上一篇写到了工厂模式,那么抽象工厂模式是什么,和工厂模式的区别在哪里?

在工厂模式中我以印刷机印刷分为中译本与英译本两种类型的书本为例,对书本创建一个产品接口,英译本与中译本各为它的一个具体实现类。

假设这台印刷机属于某一座国际化学校中,新生开学之际,不只要印刷书本,还需要印刷学校地图,学生准则,新生导引等材料。如果按照工厂模式的思路,需要对它们中的每一种材料都定义一类工厂,这样未免太过麻烦。

当所需要的对象并非某一个简单的对象(比如仅仅是书本),而是多个对象,并且这些对象可以归属于同一个系列时,可以采取抽象工厂模式实现。使用抽象工厂模式仅需创建一个工厂,它一次生产这一系列的产品。

在这里,中文版本为一个系列,英文版本为一个系列;并且这两个系列中均包含书本、地图、学生准则、新生导引。

首先还是各个产品的定义(代码仅用来示意,类和接口的权限控制根据实际情况设定):

//新生指引
interface StuGuide {
    void scanGuide();
}

class StuGuideCh implements StuGuide {
    public void scanGuide() {
        System.out.println("Chinese school guide!");
    }
}

class StuGuideEn implements StuGuide {
    public void scanGuide() {
        System.out.println("English school guide!");
    }
}
//学生准则
interface StuNorm {
    void scanNorm();
}

class StuNormCh implements StuNorm {
    public void scanNorm() {
        System.out.println("Chinese student norm!");
    }
}

class StuNormEn implements StuNorm {
    public void scanNorm() {
        System.out.println("English student norm!");
    }
}
//学校地图
interface SchoolMap {
    void scanMap();
}

class SchoolMapCh implements SchoolMap {
    public void scanMap() {
        System.out.println("Chinese school map!");
    }
}

class SchoolMapEn implements SchoolMap {
    public void scanMap() {
        System.out.println("English school map!");
    }
}
//书本
interface product_book {
    void sayContent();
}
class product_book_ch implements product_book {
    public void sayContent() {
        System.out.println("This is Chinese book !");
    }
}

class product_book_en implements product_book {
    public void sayContent() {
        System.out.println("This is English book !");
    }
}

然后定义一个抽象工厂:

abstract class AbstractFactory {
    public abstract product_book produceBook();
    public abstract SchoolMap produceMap();
    public abstract StuNorm produceNorm();
    public abstract StuGuide produceGuide();
    public void scanAll() {
        produceBook().sayContent();
        produceMap().scanMap();
        produceNorm().scanNorm();
        produceGuide().scanGuide();
    }
}

抽象工厂的具体类(以中文系列为例):

class FactoryCh extends AbstractFactory {
    public product_book product_book {
        return new product_book_ch();
    }
    public SchoolMap produceMap() {
        return new SchoolMapCh();
    }
    public StuNorm produceNorm() {
        return new StuNormCh();
    }
    public StuGuide produceGuide() {
        return new StuGuideCh();
    }
}

客户端调用:

public class Test {
    public static void main(String[] args) {
        AbstractFactory factory = new FactoryCh();
        factory.scanAll();
    }
}

这样就通过一个抽象工厂完成了同一系列的多个产品的创建。

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax