设计模式之工厂方法

Posted d_pay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之工厂方法相关的知识,希望对你有一定的参考价值。

工厂方法(Factory Method Pattern)

意图:

  定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到其子类。

类图:(来自oodesign)

  技术分享

 

工厂:工厂一般分为简单工厂,工厂方法和抽象工厂,用于创建对象,降低类间的耦合度,简单工厂可看做工厂方法的特例。

一般来说,工厂方法模式用于创建复杂对象。相比抽象工厂,工厂方法一般用于创建一个层次级别的对象,而抽象工厂更适合创建一系列不同层别的对象

如下一个创建文件的例子:

文件对象

public abstract class AbstractDocument {
    public abstract void open();
    public void save(String file){
        System.out.println(file+" is saved");
    }
    public abstract void close();
}

public class htmlDocument extends AbstractDocument{
    @Override
    public void open(){
        System.out.println("html file is open");
    }

    @Override
    public void close() {
        System.out.println("html file is closed");
    }
}

public class XMLDocument extends AbstractDocument{
    @Override
    public void open(){
        System.out.println("xml file is open");
    }

    @Override
    public void close() {
        System.out.println("xml file is closed");
    }
}

 

工厂类

  

public abstract class Creator {
    AbstractDocument document = null;
    public abstract AbstractDocument CreateDocument(String type);
    public void newDocument(String type){
        document = CreateDocument(type);
        document.open();
    }
    public void close(){
        if(document!=null){
            document.close();
        }
    }
}

public class ConcreteCreator extends Creator{
    @Override
    public AbstractDocument CreateDocument(String type){
        if(type.equals("html"))
            return new HtmlDocument();
        else
            return new XMLDocument();
    }
}

 

 

客户端:

public class Client {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        creator.newDocument("xml");
        creator.close();
        System.out.println("------------------");
        creator.newDocument("html");
        creator.close();
    }
}


/*

xml file is open
xml file is closed
------------------
html file is open
html file is closed

*/

 

工厂方法降低了类间的耦合度,对于创建较复杂的对象,可以很好的将其的创建封装在工厂方法中,保证对象间遵循迪米特法则。

如创建汽车:

public class Client {  
    public static void main(String[] args) {  
        Engine engine = new Engine();  
        Underpan underpan = new Underpan();  
        Wheel wheel = new Wheel();  
        ICar car = new Car(underpan, wheel, engine);  
        car.show();  
    }  
}  

 

陌生的类出现在了类的方法中,明显不符迪米特法则,这是便可以利用工厂方法模式:

interface IFactory {  
    public ICar createCar();  
}  
class Factory implements IFactory {  
    public ICar createCar() {  
        Engine engine = new Engine();  
        Underpan underpan = new Underpan();  
        Wheel wheel = new Wheel();  
        ICar car = new Car(underpan, wheel, engine);  
        return car;  
    }  
}  
public class Client {  
    public static void main(String[] args) {  
        IFactory factory = new Factory();  
        ICar car = factory.createCar();  
        car.show();  
    }  
}  

 

 

 

 

 

 

 

 

 

以上是关于设计模式之工厂方法的主要内容,如果未能解决你的问题,请参考以下文章

工厂模式之——工厂方法模式

二十三种设计模式之:工厂方法模式

创建型模式之工厂方法模式实例及代码操作

PHP设计模式—工厂模式之工厂方法模式

设计模式之工厂模式与工厂方法模式

设计模式之工厂方法模式