一直想学习下设计模式,不过总是被耽搁,今天就从最简单的工厂模式开始吧.记录下来.
买了个GOF的设计模式的书,不过自己水平有限,上面的例子又都不是java的,举的例子又不像国内的那种简单, 所以看起来有点吃力,
就去网上搜了下看看别人的新的,结果发现大部分内容都一样, 而且大部分内容和书上的也一样.只是例子换了而已.
对于工厂模式的描述, 各个博客基本是一字不差,而且感觉过于学院派.我还是把我个人理解写下来吧.
工厂模式分类:(GOF的书中只说了2种,1,2算一种)
1.简单工厂
2.工厂方法
3.抽象工厂
下面一种一种来说.有个博客的开车的例子不错.我也用这个例子来说明.
1.简单工厂
例如一个土豪,有三辆车,奔驰,宝马,奥迪. 还雇了司机为他开车。不过土豪坐车时总是怪怪的:
上奔驰,车后跟司机说“开奔驰车!”,坐上宝马后他说“开宝马车!”,坐上奥迪说“开奥迪车!”
这中问题,在程序中也会出现. 可以用简单工厂来解决.(总感觉好像学习多态的时候也是这种例子)
代码很简单. 先抽象一个车的接口,每个车都实现这个接口.
然后做个生产车的工厂(一个类),来判断生成什么车.
public interface Car {
public void driver();
}
public class BenCar implements Car {
@Override
public void driver() {
System.out.println("Ben dirver !!!");
}
}
public class AodiCar implements Car {
@Override
public void driver() {
System.out.println("Aodi dirver !!!");
}
}
//来判断生成什么车
public class CarFactory {
public static Car getCar(String type){
if(type.equals("Ben")){
return new BenCar();
}
if(type.equals("Aodi")){
return new AodiCar();
}
return null;
}
}
<pre name="code" class="java">public class Person {
public static void main(String[] args) {
Car car = <span style="font-family: Arial;">CarFactory </span><span style="font-family: Arial;">.getCar("Aodi");</span>
car.driver();
}
}
小结:感觉很简单吧. 这个模式有一点不好的地方,就是新增一辆车的话,就需要去工厂的CarFactory里面增加一个判断.
据说这个不符合开闭原则(对扩展开放;对修改封闭).还有就是可能如果层次多的话,CarFactory比较乱吧.
(还有个个人疑惑, 是否CarFactory里面的getCar()方法必须是static的才算简单工厂?)
2. 工厂方法
工厂方法,就是把上面的CarFactory类也抽象一下,这样就符合开闭原则, 代码如下(Car类不变,就用上面的代码)
public interface Driver {
public Car getCar();
}
public class BenDriver implements Driver {
@Override
public Car getCar() {
return new BenCar();
}
}
public class AodiDriver implements Driver {
@Override
public Car getCar() {
return new AodiCar();
}
}
public class Person {
public static void main(String[] args) {
Driver driver = new AodiDriver();
Car car = driver.getCar();
car.dirver();
}
}
总结;可以看到工厂方法就是把工厂再抽象了一下.
3.抽象工厂
抽象工厂和工厂方法貌似没有太大区别.网上的说明都是指抽象工厂是为了应付更复杂的模式.
总结: 感觉工厂模式,其实主要是面向接口编程,增强代码的可扩展性等.
这个设计模式不算太难,难的应该是什么时候用这个模式.这可能只有实战经验才行了.