设计模式系列9---和而不同的工厂模式

现在的手机制造业,在高度的繁荣发展后,流水线的工作基础,吸引了很多厂商为了压低成本,搞一些odm的手机,就是在一个模版的基础上,改下壳,换个商标的样子,就开发布会,说有新的手机!大家快带上你的钱来买,卖得好不好,纯靠营销能力啊。

例如下面的,某情怀和某米的手机,是不是很一样啊?
改一改又是一部手机!

enter image description here enter image description here

那么,作为工厂,应该怎么搞呢?

代码实现

我们设计出这个工厂的基本方法

 public class PhoneFactory {

    public static SmartPhone createSmartPhone(Class c){
        SmartPhone phone=null; 
        try {
            phone = (SmartPhone)Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            System.out.println("必须指定手机牌子");
        } catch (IllegalAccessException e) {
            System.out.println("手机定义错误");
        } catch (ClassNotFoundException e) {
            System.out.println("没这牌子手机");
        }
        return phone;
    }

}

我们的工厂盖好了,很简单,就是造部手机出来!

 public  abstract class  SmartPhone{

    public abstract void showBrand();
    public abstract void startUp();
    public abstract void shutDown();
}

接着我们的工厂提供了一个公模,所有的基础的模版,如果需要定制手机,就在这基础上修改下,我们的智能手机当然啦,很智能,能开机,关机,展示品牌,厉害吧

现在时候来展示我们的手机了,我们的各个大品牌商要开发布会,重新定义手机了,是的,重新定义手机,很牛逼哄哄的!!

先来下我们的革命级别的大米手机:

 public  class  MiPhone extends SmartPhone{

    @Override
    public void showBrand() {
        System.out.println(" 这个是大米手机");
    }

    @Override
    public void startUp() {
        System.out.println(" 大米手机正在开机");
    }

    @Override
    public void shutDown() {

        System.out.println("大米正在关机");
    }
}

接着是我们的极具情怀的东半球可能是最厉害的大锤子手机

public  class  HammerPhone extends SmartPhone{

    @Override
    public void showBrand() {
        System.out.println(" 这个是大锤子手机");
    }

    @Override
    public void startUp() {
        System.out.println(" 大锤子手机正在开机");
    }

    @Override
    public void shutDown() {

        System.out.println("大锤子正在关机");
    }
}

有了这些基础,我们的各种发布会就可以如期举行,只需要督促下我们各个工厂,叫他们加大马力,赶紧生产,产不出来的我们就饥饿营销下。

现在我们来看下,我们到底怎么生产手机

public  void main(String[] args) {

    SmartPhone smartPhone=PhoneFactory.createSmartPhone(MiPhone.class);

    smartPhone.startUp();
    smartPhone.showBrand();
    smartPhone.shutDown();
}

我们的智能手机就这样生产出来了!是不是很好的感觉?

以后别的手机友商,如果需要生产新的手机,就继承下,然后改下牌子名,就可以拿出去卖了,是不是很好!!!!!

另外如果要搞库存,保留模版,可以弄一个静态的存储!
这样初始化就能降低消耗了。

public static SmartPhone createSmartPhone(Class c) {
        SmartPhone phone = null;
        try {
            if (storePhone.containsKey(c.getSimpleName())) {
                phone = storePhone.get(c.getSimpleName());
            } else {
                phone = (SmartPhone) Class.forName(c.getName()).newInstance();
                storePhone.put(c.getSimpleName(), phone);
            }

        } catch (InstantiationException e) {
            System.out.println("必须指定手机牌子");
        } catch (IllegalAccessException e) {
            System.out.println("手机定义错误");
        } catch (ClassNotFoundException e) {
            System.out.println("没这牌子手机");
        }
        return phone;
    }

}

类图

enter image description here
我们看下我们的工厂方法的类图,是不是很灵活的样子!
我们只需要修改传递过去的手机类型,就可以开始生产手机了!

后记

写到这个钟头,都忘记好吃午饭了,写完突然觉得好饿啊。。

前面的是简单定制的案例,不过现实可能会需要点复杂的,高度定制的手机,例如那个高逼格的某果手机。曾经为了加上蓝玻璃屏幕,找了一家供应商,别人知道了这事,他股票大涨,但这家供应商的工艺跟不上,没做出来他们需要的玻璃,结果股票大跌,倒闭了,哀伤的故事啊。

对于高度定制的工厂,我们也可以在原有的基础上加点修改,从而达到想要的效果的。
那是抽象工厂方法模型,下次写,欢迎关注。

热评文章