设计模式->创建型模式->简单工厂模式

1.定义:将对象的创建委托给另一个类,客户端只负责消费对象,不负责对象的创建。即定义一个用来创建某类对象的类

2.UML:



3.理论基础:里氏替换原则,继承,多态

4.设计角色:

        抽象产品:某类产品的抽象,主要定义了产品具有的属性和行为

        产品工厂:该模式的核心,主要负责产品的创建,创建方法返回值为抽象产品

        具体产品:抽象产品的子类

5.优点

        客户端只负责消费对象,不关心对象的创建细节

6.缺点

       1. 违背开闭原则以及高内聚低耦合原则。后续其他具体产品加入时需要新增创建分支,随着分支的增加后续工厂方法的逻辑和越来越复杂。

       2.违背单一职责,工厂方法中含有承担的职责过多,负责创建合适的对象。当工厂类出现问题时候,就无法获得对象

       3.工厂方法一般都是静态的,无法被子类重载/重写,不具有扩展性

7.使用场景

        1.系统中抽象产品的种类以及具体产品的种类不多且固定

        2.不关心对象的创建,只负责消费对象

8.Code

//抽象产品

package com.patterns.build.simple.factory.common;

public interface IProducet {
    public String getProducetName();
}
//具体产品

package com.patterns.build.simple.factory.version1;

import com.patterns.build.simple.factory.common.IProducet;

public class BoxProduce implements IProducet {
    @Override
    public String getProducetName() {
        return this.getClass().getName();
    }
}


package com.patterns.build.simple.factory.version1;

import com.patterns.build.simple.factory.common.IProducet;

public class DeskProducet implements IProducet {
    @Override
    public String getProducetName() {
        return this.getClass().getName();
    }
}
//简单工厂

package com.patterns.build.simple.factory.version1;

import com.patterns.build.simple.factory.common.IProducet;

public class SimpleFactory {

    public static IProducet getInstance(String type) {
        if("DESK".equalsIgnoreCase(type)) {
            return new DeskProducet();
        } else if("BOX".equalsIgnoreCase(type)) {
            return new BoxProduce();
        } else {
            return null;
        }
    }
}
//客户端

package com.patterns.build.simple.factory.version1;

import com.patterns.build.simple.factory.common.IProducet;

public class Client {
    public static void main(String[] args) {
        IProducet produce = SimpleFactory.getInstance("desk");
        System.out.println(produce.getProducetName());

        produce = SimpleFactory.getInstance("box");
        System.out.println(produce.getProducetName());
    }
}
针对于简单工厂的缺点可以采用反射+范型进行优化。但是需要具体产品提供一个无参的构造方法

//具体产品

package com.patterns.build.simple.factory.version2;

import com.patterns.build.simple.factory.common.IProducet;

public class BikeProduce implements IProducet {
    @Override
    public String getProducetName() {
        return this.getClass().getName();
    }
}


package com.patterns.build.simple.factory.version2;

import com.patterns.build.simple.factory.common.IProducet;

public class CarProduce implements IProducet{
    @Override
    public String getProducetName() {
        return this.getClass().getName();
    }
}

//简单工厂

package com.patterns.build.simple.factory.version2;

import com.patterns.build.simple.factory.common.IProducet;

public class SimpleFactory<T> {

    public <T> T getProduec(String packageName) {
        try {
            Class<T> clazz = (Class<T>) Class.forName(packageName);
            return clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }
}
//客户端

package com.patterns.build.simple.factory.version2;

import com.patterns.build.simple.factory.common.IProducet;
import sun.security.x509.IPAddressName;

public class Client {
    public static void main(String[] args) {
        SimpleFactory<? extends IProducet> sf = new SimpleFactory<IProducet>();
        IProducet producet = sf.getProduec("com.patterns.build.simple.factory.version2.BikeProduce");
        System.out.println(producet.getProducetName());

        sf = new SimpleFactory<CarProduce>();
        IProducet car = sf.getProduec("com.patterns.build.simple.factory.version2.CarProduce");
        System.out.println(car.getProducetName());
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值