欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java描述设计模式(04):抽象工厂模式

程序员文章站 2024-02-05 20:01:28
一、抽象工厂模式 1、生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。 2、抽象工厂模式 1) 抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类; 2) 抽象工厂模式可以将 ......

一、抽象工厂模式

1、生活场景

汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。

2、抽象工厂模式

1) 抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类;
2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合;
3) 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
4) 将工厂抽象成两层,abstractfactory(抽象工厂) 和 具体实现的工厂子类,方便程序扩展。

3、代码uml图

Java描述设计模式(04):抽象工厂模式

4、源代码实现

/**
 * 抽象工厂模式
 */
public class c01_abstractfactory {
    public static void main(string[] args) {
        carproductfactory factory = new chinacarfactory() ;
        factory.getcar("hq") ;
        factory = new germanycarfactory () ;
        factory.getcar("ad") ;
    }
}

// 汽车生产抽象工厂
interface carproductfactory {
    carproduct getcar (string type) ;
}
// 中国汽车工厂
class chinacarfactory implements carproductfactory {
    @override
    public carproduct getcar(string type) {
        carproduct product = null ;
        if ("hq".equals(type)){
            product = new hqcar() ;
            product.name="红旗一号" ;
            product.date="1999-09-19" ;
            product.material();
            product.origin();
        } else if ("df".equals(type)){
            product = new dfcar() ;
            product.name="东风一号" ;
            product.date="2019-09-19" ;
            product.material();
            product.origin();
        }
        return product ;
    }
}
// 德国汽车工厂
class germanycarfactory implements carproductfactory {
    @override
    public carproduct getcar(string type) {
        carproduct product = null ;
        if ("ad".equals(type)){
            product = new adcar() ;
            product.name="奥迪a8" ;
            product.date="2017-09-19" ;
            product.material();
            product.origin();
        } else if ("bm".equals(type)){
            product = new bmcar() ;
            product.name="宝马x8" ;
            product.date="2018-09-19" ;
            product.material();
            product.origin();
        }
        return product ;
    }
}
// 汽车生产抽象类
abstract class carproduct {
    /**
     * 汽车名称
     */
    protected string name ;
    /**
     * 生产日期
     */
    protected string date ;
    /**
     * 材料
     */
    abstract void material () ;
    /**
     * 产地
     */
    abstract void origin () ;
}
// 红旗车
class hqcar extends carproduct {
    @override
    void material() {
        system.out.println(super.name+"材料...");
    }
    @override
    void origin() {
        system.out.println(super.date+":"+super.name+"在中国北京生产");
    }
}
// 东风车
class dfcar extends carproduct {
    @override
    void material() {
        system.out.println(super.name+"材料...");
    }
    @override
    void origin() {
        system.out.println(super.date+":"+super.name+"在中国南京生产");
    }
}
// 奥迪车
class adcar extends carproduct {
    @override
    void material() {
        system.out.println(super.name+"材料...");
    }
    @override
    void origin() {
        system.out.println(super.date+":"+super.name+"在德国柏林生产");
    }
}
// 宝马车
class bmcar extends carproduct {
    @override
    void material() {
        system.out.println(super.name+"材料...");
    }
    @override
    void origin() {
        system.out.println(super.date+":"+super.name+"在德国慕尼黑生产");
    }
}

二、spring框架应用

1、场景描述

spring框架中获取配置文件中bean的多种方式。

2、核心配置

<bean id="carbean" class="com.model.design.spring.node04.abstractfactory.carbean">
    <property name="name" value="中国红旗" />
</bean>
<bean id="carbean1" class="com.model.design.spring.node04.abstractfactory.carbean">
    <property name="name" value="德国奥迪" />
</bean>

3、测试文件

这里使用了两种方式获取。

@runwith(springjunit4classrunner.class)
@contextconfiguration(locations = {"classpath:/spring/spring-abstract-factory.xml"})
public class springtest {

    @resource
    private beanfactory beanfactory ;

    @test
    public void test01 (){
        carbean carbean = (carbean)beanfactory.getbean("carbean") ;
        system.out.println(carbean.getname());
    }

    @test
    public void test02 (){
        applicationcontext context01 = new classpathxmlapplicationcontext(
                "/spring/spring-abstract-factory.xml");
        carbean carbean = (carbean)context01.getbean("carbean1") ;
        system.out.println(carbean.getname());
    }
}

4、结构分析

Java描述设计模式(04):抽象工厂模式
Java描述设计模式(04):抽象工厂模式

抽象工厂封装对象的创建。在spring中,通过实现beanfactory。可以从spring的各种容器获取bean。根据bean的配置,getbean方法可以返回不同类型的对象(单例作用域)或初始化新的对象(原型作用域)。在beanfactory的实现中,我们可以区分:classpathxmlapplicationcontext,xmlwebapplicationcontext等。

三、工厂模式小结

三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式),工厂模式的核心用意将实例化对象的代码封装起来,放到工厂类中统一管理和维护,完成代码依赖关系的解耦。从而提高程序的可扩展性和维护性。

四、源代码地址

github地址:知了一笑
https://github.com/cicadasmile/model-arithmetic-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(04):抽象工厂模式
Java描述设计模式(04):抽象工厂模式