设计模式这个一听就好厉害,大神们的玩物,不过像我这样的小猿们别气馁,我们一起来学习设计模式, 设计模式很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 factoryCar 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 @
参考博文: