抽象工厂模式

    在简单工厂模式中,是通过一个具体的类来创建不同的对象;在工厂方法模式中,一个具体的工厂类负责创建一个单独的对象;按照工厂模式,主程序需要分别去操作各个工厂类,可想而知,如果工厂类较多的话,仍然不利于管理。因此这里需要一个单独的较大的工厂对其它工厂进行操作,而主程序只需要操作这个较大的工厂即可。

    在之前的翻译器示例中,再增加语义处理和语音播报的功能,按照抽象工厂模式进行修改。示意代码如下:

语义接口(Interpret.java):

package com.abstractfactory;

public interface Interpret {
public String doInterpret(String txt);
}

英语语义实现类(EnglishInterpret.java)的示意代码如下:

package com.abstractfactory;

public class EnglishInterpret implements Interpret {

    @Override
    public String doInterpret(String txt) {
        return "English Interpret: " + txt;
    }

}

中文语义实现类(ChineseInterpret.java)的示意代码如下:

package com.abstractfactory;

public class ChineseInterpret implements Interpret {

    @Override
    public String doInterpret(String txt) {
        return "解释中文语义" + txt;
    }

}

语音播报接口(Speech):

package com.abstractfactory;

public interface Speech {
public String doSpeech(String txt);
}

中文语音播报实现类(ChineseSpeech.java)的示意代码如下:

package com.abstractfactory;

public class ChineseSpeech implements Speech {

    @Override
    public String doSpeech(String txt) {
        return "语音播报" + txt;
    }

}

英语语音播报实现类(EnglishSpeech.java)的示意代码如下:

package com.abstractfactory;

public class EnglishSpeech implements Speech {

    @Override
    public String doSpeech(String txt) {
        return "Speech Sound: " + txt;
    }

}

抽象工厂类(FactoryMethod.java),示意代码如下:

package com.abstractfactory;

public abstract class FactoryMethod {
protected abstract Translate factoryMethodTranslate();
protected abstract Interpret factoryMethodInterpret();
protected abstract Speech factoryMethodSpeech();
    /**
     * 需要翻译的话语
     */
    public String sayTxt(String txt) {
        Translate translate = factoryMethodTranslate();
        Interpret interpret = factoryMethodInterpret();
        Speech speech = factoryMethodSpeech();
        return translate.sayTxt(txt) + "---" + interpret.doInterpret(txt) + "---" 
                + speech.doSpeech(txt);
    }
}

英语工厂实现类(EnglishFactoryMethod.java),示意代码如下:

package com.abstractfactory;

public class EnglishFactoryMethod extends FactoryMethod {
    public Translate factoryMethodTranslate() {
        return new EnglishTranslate();
    }
    
    public Interpret factoryMethodInterpret() {
        return new EnglishInterpret();
    }
    
    public Speech factoryMethodSpeech() {
        return new EnglishSpeech();
    }
}

中文工厂实现类(ChineseFactoryMethod.java),示意代码如下:

package com.abstractfactory;

public class ChineseFactoryMethod extends FactoryMethod {
    public Translate factoryMethodTranslate() {
        return new ChineseTranslate();
    }
    
    public Interpret factoryMethodInterpret() {
        return new ChineseInterpret();
    }
    
    public Speech factoryMethodSpeech() {
        return new ChineseSpeech();
    }
}

客户端(Client.java)的示意代码如下:

package com.abstractfactory;

public class Client {
    public static void main (String[] args) {
        FactoryMethod factoryMethod = new EnglishFactoryMethod();
        System.out.println(factoryMethod.sayTxt("测试"));
        factoryMethod = new ChineseFactoryMethod();
        System.out.println(factoryMethod.sayTxt("测试"));
    }
}

运行Client输出如下:

Hello:测试---English Interpret: 测试---Speech Sound: 测试
您好测试---解释中文语义测试---语音播报测试

在Client.java中可以看到,客户端实际上只对一个工厂类进行了操作,而调用其它更具体的工厂则交给抽象工厂去完成,降低了程序的耦合度,便于管理。

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不在负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且,如果要更换这一系列的产品,则只需要更换一个工厂类即可。

你可能感兴趣的:(设计模式,抽象工厂模式)