工厂模式

简单工厂模式(补充)

也称为静态工厂方法模式,由一个工厂对象决定创建出哪一种产品类的实例。

简单工厂模式中有如下角色:

  • 工厂类:核心,负责创建所有实例的内部逻辑,由外界直接调用。
  • 抽象产品类:要创建所有对象的抽象父类,负责描述所有实例所共有的公共接口。
  • 具体产品类:要创建的产品。
简单示例

1、抽象产品类

public abstract class MobilePhone {
    public abstract String brand();
}

2、具体产品类

public class XiaoMiMobilePhone extends MobilePhone {
    @Override
    public String brand() {
        return "xiaomi";
    }
}

public class HuaWeiMobilePhone extends MobilePhone {
    @Override
    public String brand() {
        return "huawei";
    }
}


public class VivoMobilePhone extends MobilePhone {
    @Override
    public String brand() {
        return "vivo";
    }
}

3、工厂类

public class MobilePhoneFactory {
    public static MobilePhone createMobilePhone(String type) {
        MobilePhone mobilePhone = null;
        switch (type) {
            case "xiaomi":
                mobilePhone = new XiaoMiMobilePhone();
                break;
            case "huawei":
                mobilePhone = new HuaWeiMobilePhone();
                break;
            case "vivo":
                mobilePhone = new VivoMobilePhone();
                break;
        }
        return mobilePhone;
    }
}

测试

  @Test
    public void testSimpleFactory() {
        System.out.println("xiaomi:"+ MobilePhoneFactory.createMobilePhone("xiaomi").brand());
        System.out.println("huawei:"+ MobilePhoneFactory.createMobilePhone("huawei").brand());
        System.out.println("vivo:"+ MobilePhoneFactory.createMobilePhone("vivo").brand());
    }

测试结果

xiaomi:xiaomi
huawei:huawei
vivo:vivo

它需要知道所有工厂类型,因此只适合工厂类负责创建的对象比较少的情况。
避免直接实例化类,降低耦合性。
增加新产品需要修改工厂,违背开放封闭原则。

工厂方法模式

定义一个用于创建对象的接口,使类的实例化延迟到子类。

工厂方法有以下角色:

  • 抽象产品类。
  • 具体产品类。
  • 抽象工厂类:返回一个泛型的产品对象。
  • 具体工厂类:返回具体的产品对象。
简单示例

抽象产品类和具体产品类同简单工厂一样。

1、抽象工厂类

public abstract class AbstractMobilePhoneFactory {
    public abstract  <T extends MobilePhone> T createMobilePhone(Class<T> clz);
}

4、具体工厂类

public class MobilePhoneFactoryImpl extends AbstractMobilePhoneFactory {
    @Override
    public   <T extends MobilePhone> T createMobilePhone(Class<T> clz) {
        MobilePhone mobilePhone = null;
        String classname = clz.getName();
        try {
            mobilePhone = (MobilePhone) Class.forName(classname).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) mobilePhone;
    }
}

获取工厂实例单例

//第一次调用getInstance方法时虚拟机才加载SingletonHolder并初始化sInstance,这样保证了线程安全和实例的唯一性。
public class MobilePhoneFactoryImplSingleton {
    private MobilePhoneFactoryImplSingleton() {
    }
    public static MobilePhoneFactoryImpl getInstance() {
        return SingletonHolder.sInstance;
    }
    private static class SingletonHolder {
        private static final MobilePhoneFactoryImpl sInstance = new MobilePhoneFactoryImpl();
    }
}
@Test
public void testAbstractFactory() {
        System.out.println("instance1:"+ MobilePhoneFactoryImplSingleton.getInstance());
        System.out.println("instance2:"+ MobilePhoneFactoryImplSingleton.getInstance());
        System.out.println("vivo:"+ MobilePhoneFactoryImplSingleton.getInstance().createMobilePhone(VivoMobilePhone.class).brand());
        System.out.println("huawei:"+MobilePhoneFactoryImplSingleton.getInstance().createMobilePhone(HuaWeiMobilePhone.class).brand());
        System.out.println("xiaomi:"+ MobilePhoneFactoryImplSingleton.getInstance().createMobilePhone(XiaoMiMobilePhone.class).brand());
    }

测试结果

instance1:sysshare.lq.com.demosapplication.designPattern.factory.abstractFactory.MobilePhoneFactoryImpl@2957fcb0
instance2:sysshare.lq.com.demosapplication.designPattern.factory.abstractFactory.MobilePhoneFactoryImpl@2957fcb0
vivo:vivo
huawei:huawei
xiaomi:xiaomi
  • 相比简单工厂,如果我们需要新增产品类,无需修改工厂类,直接创建产品即可。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 5,095评论 0 7
  • 昨天,一场春雨飘落京城。 1 早上,推门而出,吸入第一口空气,没有往日的干燥硬冷,湿润感透过鼻腔,一点点穿过气管,...
    flyinrain12123阅读 3,258评论 2 6
  • 东方还未吐白,我已经苏醒了,比尼采自诩的伟大的太阳还要早一点。窗外还是灰蒙蒙的一片,如阴阳交替的逢魔时刻。刚从梦境...
    年桦桦阅读 1,014评论 0 1