美文网首页
工厂模式

工厂模式

作者: 天空在微笑 | 来源:发表于2019-08-12 11:40 被阅读0次
简单工厂模式(补充)

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

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

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

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
  • 相比简单工厂,如果我们需要新增产品类,无需修改工厂类,直接创建产品即可。

相关文章

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 工厂模式

    工厂模式细分三种:简单工厂模式、工厂模式、抽象工厂模式。 工厂模式相当于抽象了简单工厂模式的工厂类,而抽象工厂模式...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

    找女朋友之简单工厂模式,工厂模式,抽象工厂模式 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

  • 【设计模式】- 工厂模式

    工厂模式分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。 工厂模式:靠工厂生产对象 简单工厂模式中只有一个工厂...

  • 工厂模式

    工厂模式包含三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。 简单工厂模式 定义简单工厂模式:由一个工厂类根据...

  • Java设计模式——工厂模式

    工厂模式简单工厂模式工厂方法模式抽象工厂模式 1.简单工厂模式 1.基本介绍1)简单工厂模式也叫静态工厂模式,是属...

  • 设计模式-3种工厂模式

    工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式 工厂方法根据参数直接创建实例:工厂->产品 ...

  • 设计模式-工厂模式

    工厂模式概念 实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂模式...

  • 第一章2.0工厂- 基础类准备

    2.1工厂-简单工厂模式2.2工厂-工厂方法模式2.3工厂-抽象工厂模式

网友评论

      本文标题:工厂模式

      本文链接:https://www.haomeiwen.com/subject/qciyjctx.html