Press "Enter" to skip to content

设计模式—工厂方法模式

工厂方法模式是一种创建型设计模式,它将对象(产品)的创建交给一个工厂(通过工厂的接口,即面向接口进行)。当需要生成另一种产品时,只需要修改工厂的具体类型即可,工厂创建产品的部分不必进行修改。

下面以生产某本书的英译本或中译本为例。

首先明确在这个例子中要生产的产品为书本,它分为中译本和英译本。我们采用创建型的设计模式—工厂方法模式,将工厂接口命名为factory_printer,工厂的具体类有factory_printer_ch—负责生产中译本,factory_printer_en—负责生产英译本。

为了能够在获得工厂创建的产品后,对其进行统一的引用,即不必区分是中译本还是英译本,我们还需要一个书本的接口product_book,它也具有两个具体类product_book_ch和product_book_en。

首先是两个接口的定义:

interface product_book {
    void sayContent(); //输出书本内容
}

interface factory_printer {
    product_book print(); //印刷书本(即创建对象)
}

产品的两个具体类:

class product_book_ch implements product_book {
    public void sayContent() {
        System.out.println("这是一本中文书!");
    }
}

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

工厂的两个具体类:

class factory_printer_ch implements factory_printer {
    public product_book print() {
        return new product_book_ch();
    }
}

class factory_printer_en implements factory_printer {
    public product_book print() {
        return new product_book_en();
    }
}

客户端调用:

public class Test {
    public static void main(String[] args) {
        //假如要生产英译本,仅需将factory_printer_ch改为factory_printer_en
        factory_printer printer = new factory_printer_ch(); 
        product_book book = printer.print();
        book.sayContent(); //输出:这是一本中文书!
    }
}

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