设计模式——工厂模式

本文详细介绍了工厂模式的概念及其在实际项目中的应用。通过示例代码展示了如何创建一个工厂来生产具有相同属性或行为的对象,适用于需要在多处创建相同对象的情况。

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

设计模式——工厂模式

工厂模式:一种创建行模式,提供了一种创建具有相同属性或行为的对象的最佳方式。顾名思义工厂生产出来的产品都是标准化的,如果在项目中需要在多处地方创建相同的对象(对对象进行了相同的处理并提供出来),此时可以考虑使用工厂模式!

废话不多说,show code!

 

1-定义Factory,定义抽象方法

工厂模式,首先需要工厂一般定义成一个接口或者抽象类

package designPattern.test.factory.simple;

/**
 * 工厂接口,还不确定生产的产品,定义成泛型接口
 * 生产类型为T的产品
 */
public interface Factory<T> {
    T create();
}

2-定义产品

工厂的存在就是生产产品的,有了工厂就可以根据具体的项目定义具体的产品了,下面以手机为例介绍工厂模式中的产品

2.1-定义产品的行为

产品生产出来就是供使用的,将产品的行为抽象出来

package designPattern.test.factory.simple.product;

/**
 * 手机接口
 */
public interface Phone {

    /**
     * 手机可以打电话
     */
    void call(String name);

    /**
     * 手机可以发短信
     */
    void sendMessage(String name,String message);

}

2.2-定义抽象产品

工厂生产的产品具有一些特定的属性,通常都是标准化的,一般不会改变!

package designPattern.test.factory.simple.product;

import java.io.Serializable;

/**
 * 抽象产品
 */
public abstract class BasePhone implements Serializable {

    //长度
    private double length;

    //宽度
    private double width;

    //厚度
    private double thick;

    //颜色
    private String color;

    public BasePhone(){}

    public BasePhone(double length, double width, double thick, String color) {
        this.length = length;
        this.width = width;
        this.thick = thick;
        this.color = color;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getThick() {
        return thick;
    }

    public void setThick(double thick) {
        this.thick = thick;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "BasePhone{" +
                "length=" + length +
                ", width=" + width +
                ", thick=" + thick +
                ", color='" + color + '\'' +
                '}';
    }

}

2.3定义具体产品

具体的产品,定义ApplePhone

package designPattern.test.factory.simple.product;

/**
 * Apple手机
 */
public class ApplePhone extends BasePhone implements Phone {

    public ApplePhone() {
        super();
    }

    public ApplePhone(double length, double width, double thick, String color) {
       super(length,width,thick,color);
    }

    @Override
    public void call(String name) {
        System.out.println("使用Apple手机" + this.toString() + "打电话给" + name);
    }

    @Override
    public void sendMessage(String name, String message) {
        System.out.println("使用Apple手机" + this.toString() + "发短信给" + name + ",内容为:" + message);
    }

}

定义具体产品:HuaWeiPhone

package designPattern.test.factory.simple.product;

/**
 * 华为手机
 */
public class HuaWeiPhone extends BasePhone implements Phone {

    public HuaWeiPhone() {
        super();
    }

    public HuaWeiPhone(double length, double width, double thick, String color) {
        super(length, width, thick, color);
    }

    @Override
    public void call(String name) {
        System.out.println("使用HuaWei手机" + this.toString() + "打电话给" + name);
    }

    @Override
    public void sendMessage(String name, String message) {
        System.out.println("使用HuaWei手机" + this.toString() + "发短信给" + name + ",内容为:" + message);
    }
}

3定义工厂

3-1定义抽象工厂

package designPattern.test.factory.simple.factory;

import designPattern.test.factory.simple.Factory;
import designPattern.test.factory.simple.product.BasePhone;

/**
 * 手机工厂
 */
public abstract class PhoneFactory implements Factory<BasePhone> {

    /**
     * 获取Factory方法
     */
    public static Factory getFactory(Class clazz) {
        Factory factory = null;
        try {
            factory = (Factory) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return factory;
    }

}

3-2定义具体手机工厂

ApplePhoneFactory

package designPattern.test.factory.simple.factory;

import designPattern.test.factory.simple.product.ApplePhone;
import designPattern.test.factory.simple.product.BasePhone;

/**
 * Apple手机工厂
 */
public class ApplePhoneFactory extends PhoneFactory {

    /**
     * 生产具体的ApplePhone产品,如果需要对ApplePhone进行统一的初始化操作
     * 可以都定义在这里,项目中就不需要在重复初始化了
     */
    @Override
    public BasePhone create() {
        return new ApplePhone(155, 88, 9.1, "golden");
    }

}

HuaWeiPhoneFactory

package designPattern.test.factory.simple.factory;

import designPattern.test.factory.simple.product.BasePhone;
import designPattern.test.factory.simple.product.HuaWeiPhone;

/**
 * 华为手机
 */
public class HuaWeiPhoneFactory extends PhoneFactory {

    /**
     * 生产具体的HuaWeiPhone产品,如果需要对HuaWeiPhone进行统一的初始化操作
     * 可以都定义在这里,项目中就不需要在重复初始化了
     */
    @Override
    public BasePhone create() {
        return new HuaWeiPhone(155, 88, 10.2, "golden");
    }

}

4测试

package designPattern.test.factory.simple;

import designPattern.test.factory.simple.factory.ApplePhoneFactory;
import designPattern.test.factory.simple.factory.HuaWeiPhoneFactory;
import designPattern.test.factory.simple.factory.PhoneFactory;
import designPattern.test.factory.simple.product.Phone;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * 工厂模式测试
 */
public class FactoryTest {

    private static final String APPLEPHONE = "applePhone";
    private static final String HUAWEIPHONE = "huaweiPhone";

    /**
     * 工厂集合
     */
    private static Map<String, Factory> factoryMap = new HashMap<>();

    /**
     * 初始化工厂放入集合中
     */
    static {
        Factory applePhoneFactory = PhoneFactory.getFactory(ApplePhoneFactory.class);
        Factory huaweiPhoneFactory = PhoneFactory.getFactory(HuaWeiPhoneFactory.class);
        factoryMap.put(APPLEPHONE, applePhoneFactory);
        factoryMap.put(HUAWEIPHONE, huaweiPhoneFactory);
    }

    /**
     * 生产ApplePhone,打电话发短信
     */
    @Test
    public void testApplePhone() {
        Factory factory = factoryMap.get(APPLEPHONE);
        callAndSendMsg(factory, "yudaijing", "HelloWorld");
    }

    /**
     * 生产ApplePhone,打电话发短信
     */
    @Test
    public void testHuaWeiPhone() {
        Factory factory = factoryMap.get(HUAWEIPHONE);
        callAndSendMsg(factory, "yudaijing", "HelloWorld");
    }

    /**
     * 工厂生产出手机后就打电话发短信
     */
    private void callAndSendMsg(Factory factory, String name, String msg) {
        Phone phone = (Phone) factory.create();
        phone.call(name);
        phone.sendMessage(name, msg);
    }

}

总结:一般来讲,创建复杂的、经常需要创建的对象就应该考虑使用工厂了,一般直接new方法就可以创建的JavaBean不建议使用工厂模式!










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值