设计模式之工厂

     设计模式这个一听就好厉害,大神们的玩物,不过像我这样的小猿们别气馁,我们一起来学习设计模式, 设计模式很NB,但是为什么要使用设计模式呢? 模式给我们带来什么好处呢?我们一直在学习设计模式,这些问题我们应该提出!

1 简单工厂模式
顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。
它由三种角色组成(关系见下面的类图):
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。根据不同需求定制不同产品

2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

简单抽象模式,就是在工厂中对抽象产品进行具体化。可以叫定制产品。但是,具体产品增多,工厂也许跟着修改。所以。引入概念:开闭原则: 设计模块的时候,是这个模块不修改的前提下扩充。

 从一个小故事开始:

一车工厂的例子,一个高富帅拥有很多辆车,奔驰宝马….每辆车都有一个司机,每辆车的司机只自己负责的车,所以,有一天高富帅要门,不可能让他去主动叫司机来,(高富帅的尿性),管家这下忙了,还好他懂工厂模式,只要内混蛋说要开要坐那辆车出门,他只需要安排跟班师傅就行了。


 

//抽象产品(高富帅有很多车,丫的都是车,这里就说明他有车。)

public interface Car {
    public void Drive();

}

//具体产品 奔驰 宝马 法拉利。。。

public class Benz implements Car {

    @Override
    public void Drive() {
        System.out.println("I am in Benz");
    }

}

public class Bwm implements Car {

    @Override
    public void Drive() {
        System.out.println("I am in BWM");
    }

}

//工厂

public class Driver {

    public static Car driverCar(String s) throws Exception {
        if (s.equalsIgnoreCase("benz"))
            return new Benz();
        else if (s.equalsIgnoreCase("bwm"))
            return new Bwm();
        else throw new Exception();
    }
   

}

//实际调用

public class Test{
    public static void main(String[] args) {
       

//easy factory
Car car = null;
try {

//这2B要坐奔驰出门
    car = Driver.driverCar("benz");
} catch (Exception e) {
    e.printStackTrace();
}
car.Drive();

        
    }
}

2 工厂方法模式

 工厂方法,其实就是将工厂的方法抽象,不再专门生产一种产品,只有一个车间,将工厂的概念涉及到方法。动态分配角色。这样一个工厂只负责一件事情,就是成产,至于生产生么产品,那是继承了工厂的工人的问题了。符合开闭原则,以后只需要扩展工厂就行了。还拿上面的败家子说事儿,还是那个2B坐车的事儿。时间久了,丫的管家也有钱有势,而且负责的事情比较多,不能光给败家子管理车。所以有了很多主力。败家子再先坐车的话,直接跟他助理交代一声就好,这些助理们没事儿跟司机师傅走得很近。

//负责奔驰的助理 他直接告诉师傅今天败家子要坐车

public class BenzDriver implements DriverFactory {

    @Override
    public Car driveCar() {
        return new Benz();
    }

}

//宝马助理也是

public class BwmDriver implements DriverFactory {

    @Override
    public Car driveCar() {
        return new Bwm();
    }

}

//实际调用

    public static void main(String[] args) {
                
        //abstract factory
       
        //败家子直接跟负责奔驰的助理说就行了
        DriverFactory  dv = new BenzDriver();
        Car car = dv.driveCar();
        car.Drive();
       
    }
}

3抽象工厂模式

抽象工厂模式其实就是简单工厂的升级,主要针对的是产品复杂度来说。比较适合抽象工厂模式。即产品族:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。这个很容易很工厂方法混淆(好吧,我一开始就混淆了。)

如果实在不好理解。就这么记住: 工厂方法就是工厂的方法就是一个车间,生产什么看工人技术了(具体工厂)。 抽象模式就是:工厂有N个车间,你到哪个车间就生产什么。这个我就不拿败家子举例子了,得饶人处且饶人啊。。

代码实例

interface IProduct1 {
    public void show();
}
interface IProduct2 {
    public void show();
}

class Product1 implements IProduct1 {
    public void show() {
        System.out.println("这是1型产品");
    }
}
class Product2 implements IProduct2 {
    public void show() {
        System.out.println("这是2型产品");
    }
}

interface IFactory {
    public IProduct1 createProduct1();
    public IProduct2 createProduct2();
}
class Factory implements IFactory{
    public IProduct1 createProduct1() {
        return new Product1();
    }
    public IProduct2 createProduct2() {
        return new Product2();
    }
}

public class Client {
    public static void main(String[] args){
        IFactory factory = new Factory();
        factory.createProduct1().show();
        factory.createProduct2().show();
    }
}

代码来源 :http://blog.csdn.net/zhengzhb/article/details/7359385

总结:

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

PS:通过那个败家子的事儿,我是知道什么叫工厂模式了,最后感觉管家脑子很好使,哪天跳槽肯定是个CEO。呵呵。 话说一开始玩我真没有搞明白是怎么回事儿,发过帖子之后我又把Google工厂模式硬是把前3页相关帖子看了一遍,现在终于搞明白了。所以感觉技术的学东西切勿急躁,最起码到了一个自己感觉合适的境界再起去进行下一个问题。无论什么设计模式都是实际项目中积累出来的。在这里感谢大神们了。

鸣谢 @珍山钙茶  csdn @卡奴达摩

参考博文:http://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html

原文地址:https://www.cnblogs.com/nishilunhui/p/2970341.html