您的位置:首页 > 其它

设计模式之四:抽象工厂模式—产品族的创建

2016-09-22 15:26 162 查看
工厂方法模式的问题:

每个工厂只生产一个产品,导致系统中存在大量的工厂类,增加系统的开销,将相同的产品组成一个产品族,由同一个工厂来创建
抽象工厂模式概述:
抽象工厂模式为创建一组对象提供了一种解决方案,于工厂方法模式相比,抽象工厂模式中的具体工厂不止是创建了一种产品,啊负责创建一族产品:提供了一个创建一系列相关或者相互依赖对象接口,而无需制定他们的具体类,抽象工厂模式又称为kit模式,他是一种对象创建型模式。

一、抽象工厂方法模式概述:
abstract class AbstractFactory{
    public abstract AbstractFactoryA createOriductA();
    public abstract AbstractFactoryB createOriductB();

}

class ConcreteFactory1 extends AbstractFactory{
    //工厂方法一
    public AbstractFactoryA createProductA(){
        return new ConcreteFactoryA1();
    }
    //工厂方法二
    public AbstractFactoryB createProductB(){
        return new ConcreteFactoryB1();
    }
}

二、完整解决方案:

//按钮借口,抽象产品
interface Button{
    public void display();
}
//Spring按钮类:具体产品
class SpringButton implements Button{
    public void display(){
        System.out.println("显示浅绿色按钮");
    }

}
//sunmmer按钮类:具体产品
class SummerButton implements Button{

    public void display() {
        System.out.println("显示浅蓝色按钮");    
    }
}
//文本框借口:抽象产品
interface TextField{
    public void display();
}
//spring文本框类
class SpringTextField implements TextField{
    public void display(){
        System.out.println("显示绿色边框文本框");
    }
}
//summer文本框类
class SummerTextField implements TextField{
    public void display(){
        System.out.println("显示蓝色边框文本");
    }
}
//组合框借口:抽象产品
interface ComboBox{
    public void display();
}
//spring组合框类:具体产品

class SpringComboBox implements ComboBox{
    public void display(){
        System.out.println("显示绿色组合边框");
    }
}
class SummerComboBox implements ComboBox{
    public void display(){
        System.out.println("显示蓝色边框组合");
    }
}
//界面皮肤工厂借口:接口工厂
interface SkinFactory{
    public Button createButton();
    public TextField createTextField();
    public ComboBox createComboBox();
}

//Spring皮肤工厂:具体工厂
class SpringSkinFactory implements SkinFactory{

    @Override
    public Button createButton() {
        return new SpringButton();
    }

    @Override
    public TextField createTextField() {
        return new SpringTextField();
    }

    @Override
    public ComboBox createComboBox() {
        return new SpringComboBox();
    }

}
class SummerSkinFactory implements SkinFactory{

    @Override
    public Button createButton() {
        return new SummerButton();
    }

    @Override
    public TextField createTextField() {
        return new SummerTextField();
    }

    @Override
    public ComboBox createComboBox() {
        return new SummerComboBox();
    }

}

加入XMLUtil有更好的灵活性和可扩展性,加入:
<config>
    <className>SpringSkinFactory</className>

</config>

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
class XMLUtil{
    public static String getChartType(){
        try{
            DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
            DocumentBuilder builer=dFactory.newDocumentBuilder();
            Document doc;
            doc=builer.parse(new File("config.xml"));

            NodeList nl=doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();

            Class c=Class.forName(cName);
            Object obj=c.newInstance();
            return obj;
            }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }    

}
public class Client{
    public static void main(String[] args) {
        SkinFactory factory;
        Button bt;
        TextField tf;
        ComboBox cb;
        factory=(SkinFactory)XMLUtil.getBean();
        bt=factory.createButton();
        tf=factory.createTextField();
        cb=factory.createComboBox();
        bt.display();
        tf.display();
        cb.display();
    }
}
三、抽象工厂模式总结:
主要优点
隔离了具体类的生成,使得客户并不需要知道什么被创建
当一个产品族中的多个对象呗设计成一起工作时,它能够保证客户短时视同一个产品族中的对象
增加新的产品族很方便,无需修改已有系统,符合开闭原则

主要缺点:
增加新的产品登记结构麻烦,违反了开闭原则

使用场景
无需关心如何被创建
有多余一个产品族
一个产品族在一起使用
产品登记结构稳定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息