实例:买宝马车。不用设计模式:一个客户今天买宝马1系列车,明天买宝马系列2车,后天系列3.。。。
工厂模式主要是:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来
一、简单工厂模式
/**
* 抽象产品:宝马车
*
* @author XiaoGang
*
*/
public abstract class BWM {
public BWM() {
}
}
package parttern1.simplefactory;
/**
* 具体产品:宝马车系列1
*
* @author XiaoGang
*
*/
public class BWM_1 extends BWM {
public BWM_1() {
System.out.println("宝马系列1");
}
}
package parttern1.simplefactory;
/**
* 具体产品:宝马车系列2
*
* @author XiaoGang
*
*/
public class BWM_2 extends BWM {
public BWM_2() {
System.out.println("宝马系列2");
}
}
package parttern1.simplefactory;
/**
* 工厂
*
* @author XiaoGang
*
*/
public class Factory {
/**
*
* @param type
* 所生产的车的系列
* @return 所要的系列中的一辆车实例
*/
public BWM creatBWM(int type) {
switch (type) {
case 1:
return new BWM_1();
case 2:
return new BWM_2();
default:
break;
}
return null;
}
}
package parttern1.simplefactory;
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
BWM bwm1 = factory.creatBWM(1);
BWM bwm2 = factory.creatBWM(2);
}
}
简单工厂模式又称静态工厂方法模式。命名上就可以看出这个模式一定很简单。它存在的目的很简单: 定义一个用于创建对象的接口 。
每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。
于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
二、工厂方法模式
修改工厂类:定义一个工厂接口,和生产各种系列车的工厂类(实现工厂接口)
package parttern1.simplefactory;
/**
* 工厂接口
*
* @author XiaoGang
*
*/
public interface IFactory {
/**
* @return 宝马车的抽象类
*/
BWM creatBWM();
}
package parttern1.simplefactory;
/**
* 工厂:专门生产宝马系列1
*
* @author XiaoGang
*
*/
public class FactoryBWM_1 implements IFactory {
@Override
public BWM creatBWM() {
return new BWM_1();
}
}
package parttern1.simplefactory;
/**
* 工厂:专门生产宝马系列2
*
* @author XiaoGang
*
*/
public class FactoryBWM_2 implements IFactory {
@Override
public BWM creatBWM() {
return new BWM_2();
}
}
package parttern1.simplefactory;
public class Customer {
public static void main(String[] args) {
// Factory factory = new Factory();
//
// BWM bwm1 = factory.creatBWM(1);
//
// BWM bwm2 = factory.creatBWM(2);
FactoryBWM_1 factory1 = new FactoryBWM_1();
BWM bwm1 = factory1.creatBWM();
FactoryBWM_2 factory2 = new FactoryBWM_2();
BWM bwm2 = factory2.creatBWM();
}
}
如果需要新系列车型,直接新定义一个新系列汽车工厂,就可以得到新系列车产品,而不用修改老代码!