设计模式-工厂模式(Java)

一:工厂方法模式

  1.抽象产品:所有子类产品的基类,给出一个抽象接口或者抽象类

   2.具体产品:继承抽象产品的属性,方法,具有某种特质的具体产品

   3.抽象工厂:包含产品的核心业务逻辑,写一个抽象接口和抽象类

   4.具体工厂:继承抽象工厂的具体工厂,实现具体业务逻辑

二、工厂方法使用场景

1、无法预知对象确切类别及其依赖关系时。
2、为了能够扩展代码中的组件时。
3、复用现有对象节省系统资源时。

三、对应的工厂方法模式角色

1、抽象产品:小米产品
2、具体产品:小米手机 平板 手表
3、抽象工厂:小米工厂
4、具体工厂:小米手机工厂 平板工厂 手表工厂

四、示例图、UML

五、抽象产品

定义一个产品接口,为所有产品的父类:XiaoMiProduct.java ,其定义了常量 MANUFACTUERER(制造商)= Apple,抽象接口:getManufacturer()获取制造商,getProductName()获取具体产品名称。

 

六、具体产品

1.手机产品

小米产品的子类,实现抽象产品的抽象接口 XiaoMiPhone.java

 可能产品类型很多,所以确定不了,这里建立两个系列的手机 小米12 小米13系列,继承手机产品,重写getProductName()方法

 

 2.平板产品

小米产品的子类,实现抽象产品的抽象接口 XiaoMiIpad.java

3.抽象工厂

定义一个工厂接口,工厂存在的意义:生产 XiaoMiFactory.java 抽象接口:produce.java 生产产品

七、具体工厂

1.手机工厂

实现抽象工厂的方法,是实现创建产品的地方,含有具体创建产品的业务逻辑。实现抽象工厂produce()方法,通过反射创建对象。

public class XiaoMiPhoneFactory implements XiaoMiFactory<XiaoMiPhone> {
    /**
     * 小米工厂生产手机
     * @param claszz
     * @return
     */
    @Override
    public XiaoMiPhone produce(Class<? extends XiaoMiPhone> claszz) {
        try {
            return claszz.newInstance();
        }catch (InstantiationException | IllegalAccessException e){
            e.printStackTrace();
            return null;
        }
    }
}

2.平板工厂

实现抽象工厂的方法,就是创建产品的地方,含有具有创建产品的业务逻辑,实现抽象工厂的product()方法,通过反射创建对象。

public class IpadFactory implements XiaoMiFactory<IpadFactory>{
    @Override
    public IpadFactory produce(Class<? extends IpadFactory> claszz) {
        try {
            return claszz.newInstance();
        }catch (InstantiationException | IllegalAccessException e){
            e.printStackTrace();
            return null;
        }
    }
}

八、通过工厂创建对象

1.实例化手机,平板工厂:XiaoMiPhoneFactory IpadFactory

2.通过工厂的producr()方法,传入具体需要创建的产品

3.输出具体产品的制造商和产品名称

    @Test
    void contextLoads() {
        //小米手机工厂
        XiaoMiFactory<XiaoMiPhone> phoneXiaoMiFactory = new XiaoMiPhoneFactory();
        //平板工厂
        XiaoMiFactory<XiaoMiIpad> ipadIpadFactory = new IpadFactory();
        XiaoMiProduct product = phoneXiaoMiFactory.produce(XiaoMiPhone.class);
        XiaoMiProduct product1 = ipadIpadFactory.produce(XiaoMiIpad.class);
        System.out.println(product.getManufacturer() + product.getProductName());
        System.out.println(product1.getManufacturer() + product1.getProductName());
    }

结果:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值