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

本文深入介绍了抽象工厂模式的概念、实现及应用场景。通过示例代码详细解释了如何利用抽象工厂模式来创建一系列相关联的对象,同时保持代码的灵活性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂方法模式的问题:
每个工厂只生产一个产品,导致系统中存在大量的工厂类,增加系统的开销,将相同的产品组成一个产品族,由同一个工厂来创建
抽象工厂模式概述:
抽象工厂模式为创建一组对象提供了一种解决方案,于工厂方法模式相比,抽象工厂模式中的具体工厂不止是创建了一种产品,啊负责创建一族产品:提供了一个创建一系列相关或者相互依赖对象接口,而无需制定他们的具体类,抽象工厂模式又称为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();
    }
}
三、抽象工厂模式总结:
  1. 主要优点
    1. 隔离了具体类的生成,使得客户并不需要知道什么被创建
    2. 当一个产品族中的多个对象呗设计成一起工作时,它能够保证客户短时视同一个产品族中的对象
    3. 增加新的产品族很方便,无需修改已有系统,符合开闭原则
  2. 主要缺点:
    1. 增加新的产品登记结构麻烦,违反了开闭原则
  3. 使用场景
    1. 无需关心如何被创建
    2. 有多余一个产品族
    3. 一个产品族在一起使用
    4. 产品登记结构稳定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值