欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式—工厂模式

程序员文章站 2024-01-21 14:36:46
...

1、简单(静态)工厂

老板要创立一个手机代工工厂,可以生产苹果手机,华为手机、小米手机,开始干活创建工厂。

示例

public class MobileStaticFactory {

    public static final String TYPE_IPHONE="iphone";//苹果手机

    public static final String TYPE_HUAWEI="huawei";//华为手机

    public static final String TYPE_MI="mi";    //小米手机

    /**
     * 根据类型返回对应的手机
     * @param type
     * @returnE
     */
    public static Imobiles createmobiles(String type){
        if (TYPE_IPHONE.equals(type)){
            return new Iphone();
        }else if (TYPE_HUAWEI.equals(type)){
            return new Huawei();
        }else if (TYPE_MI.equals(type)){
            return new Mi();
        }

        return  null ;
    }

    public static void main(String[] args) {
        Imobiles imobiles = MobileStaticFactory.createmobiles("iphone");
    }
}

由于oppo和vivo手机卖的比较火,我们也要代工oppo和vivo手机的生产了,发现我们创建的工厂可扩展性比较差,生产这两种手机的话,需要改造我们工厂类,对我们的工厂进行改造,通过反射机制来生产我们的产品。

示例

public class SimpleMobileFactory {

    /**
     * 根据传入的class实例化对象
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T extends Imobiles>T createMobiles(Class<T> clazz){
        try {
            return (T) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return  null ;
    }

    public static void main(String[] args) {
        Imobiles imobiles = SimpleMobileFactory.createMobiles(Iphone.class);
    }
}

改造完成,我们可以来生产任何品牌的手机了。

2、工厂方法

突然一天老板说我们要做加入型号和操作系统,由于Class.forName(clz.getName()).newInstance() 调用的是无参构造函数生成对象,它和new Object()是一样的性质工厂方法应该用于复杂对象的初始化 ,当需要调用有参的构造函数时便无能为力了看一下我们的工厂不能满足要求,由于我们的业务已经做的很大了,所以我们要建立华为工厂、苹果工程、小米工厂。

示例

//抽象工厂类
public abstract class AbstractMobileFactory {
    //定义生产手机的抽象方法
    public abstract Imobiles createMobile(String version,String system);
}
//工厂类
public class HuaweiFactory extends AbstractMobileFactory {

    public Imobiles createMobile(String version,String system) {
        return new Huawei(version,system);
    }
}
public class IphoneFactory extends AbstractMobileFactory {

    public Imobiles createMobile(String version,String system) {
        return new Iphone(version,system);
    }
}
public class MiFactory extends AbstractMobileFactory {

    public Imobiles createMobile(String version,String system) {
        return new Mi(version,system);
    }
}
public class FactoryClient {
    public static void main(String[] args) {
		//生产装有ios10.2操作系统的iphone6s
        AbstractMobileFactory iphoneFactory = new IphoneFactory();
        Imobiles imobiles = iphoneFactory.createMobile("6s","ios10.2");
    }
}

3、抽象工厂

生产规模继续扩大,我们要生产音乐手机了。继续改造我们的工厂,支持音乐手机生产。

实例

//抽象工厂类
public abstract class AbstractMobileFactory {

    public static final String TYPE_IPHONE="iphone";//苹果手机
    public static final String TYPE_HUAWEI="huawei";//华为手机
    public static final String TYPE_MI="mi";    //小米手机
    public static final String TYPE_IPHONEMUSIC="iphonemusic";//苹果手机
    public static final String TYPE_HUAWEIMUSIC="huaweimusic";//华为手机
    public static final String TYPE_MIMUSIC="mimusic";    //小米手机
    
    //定义生产手机的抽象方法
    public abstract Imobiles createMobile(String version,String system);

    public Imobiles createMobile(String type,String version,String system){
        if (TYPE_IPHONE.equals(type)){
            return new Iphone(version, system);
        }else if (TYPE_IPHONEMUSIC.equals(type)){
            return new IphoneMusic(version, system);
        }else if (TYPE_HUAWEI.equals(type)){
            return new Huawei(version, system);
        }else if (TYPE_HUAWEIMUSIC.equals(type)){
            return new HuaweiMusic(version, system);
        }else if (TYPE_MIMUSIC.equals(type)){
            return new MiMusic(version, system);
        }else if (TYPE_MI.equals(type)){
            return new Mi(version, system);
        }
        return null ;
    }

}

//华为手机工厂
public class HuaweiFactory extends AbstractMobileFactory {
    public Imobiles createMobile(String version,String system) {
        return new Huawei(version,system);
    }
}
//华为音乐手机工厂
public class HuaweiMusicFactory extends AbstractMobileFactory {
    public Imobiles createMobile(String version,String system) {
        return new Huawei(version,system);
    }
}

//默认的工厂
public class DefaultFactory extends AbstractMobileFactory{

    private IphoneFactory defaultFactory = new IphoneFactory();

    public Imobiles createMobile(String version, String system) {
        return new IphoneFactory().createMobile(version, system);
    }
}

public class FactoryClient {
    public static void main(String[] args) {
        DefaultFactory factory = new DefaultFactory();
        Imobiles imobiles = factory.createMobile("huawei","6s","ios10.2");
    }
}