工厂模式
简单工厂模式
简单工厂模式(Simple Factory Pattern),又称为静态工厂方法(static Factory Method),它属于创建型模式。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
比如有一个电脑商,目前生产联想电脑,随着业务扩展,他现在需要生产惠普的电脑,我们就需要一个单独的类来专门生产电脑,这就用到了简单工厂模式。
下面以代码为例:
接口:
package designpattern.factory.simplefactory.noodles;
public interface INoodles {
/**
* 描述每种面条啥样的
*/
public abstract void desc();
}
package designpattern.factory.simplefactory.noodles;
public class LzNoodles implements INoodles {
@Override
public void desc() {
System.out.println("兰州拉面,兰州特色小吃");
}
}
package designpattern.factory.simplefactory.noodles;
public class PaoNoodles implements INoodles {
@Override
public void desc() {
System.out.println("泡面,程序员必备");
}
}
package designpattern.factory.simplefactory.noodles;
public class ReganNoodles implements INoodles {
@Override
public void desc() {
System.out.println("红油热干面,武汉特色小吃");
}
}
简单工厂模式
package designpattern.factory.simplefactory;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
import designpattern.factory.simplefactory.noodles.PaoNoodles;
import designpattern.factory.simplefactory.noodles.ReganNoodles;
/**
* 简单工厂模式
* 一家“简单面馆”(简单工厂类)
*/
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//兰州拉面
public static final int TYPE_PM = 2;//泡面
public static final int TYPE_GK = 3;//热干面
/**
* 如果生产对象的方法是static的,这种简单工厂也叫做静态工厂
* 如果生产对象的方法不是static的,这种简单工厂也叫做实例工厂
* @param type
* @return
*/
public static INoodles createNoodles(int type) {
switch (type) {
case 1:
return new LzNoodles();
case 2:
return new PaoNoodles();
case 3:
return new ReganNoodles();
default:
return new LzNoodles();
}
}
}
测试
package designpattern.factory.simplefactory;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
public class Test {
public static void main(String[] args) {
/**
* 一开始,穷,想吃面必须得自己做
* 想吃拉面得自己做,new LzNoodles()
* 想吃泡面得自己做,new PaoNoodles()
* 想吃热干面得自己做,new ReganNoodles()
*/
// 做拉面吃
INoodles lzNoodles = new LzNoodles();
// 做泡面吃
// INoodles paoNoodles = new PaoNoodles();
// 做热干面吃
// INoodles reganNoodles = new ReganNoodles();
// 然而,new来new去,改来改去,好心烦......
/**
* 忽然,有一天走了狗屎运成了暴发户
* 幸福生活从此来临,吃面从此变得简单
* 给面馆说一声想吃啥,面馆做好了给自己就好了
* 自己不必关心面条怎么做(怎么new,如何new)让面馆操心去吧(面馆帮我们new)!
* 好省心,有钱就是好,太爽了!
*/
INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2); // 和具体的对象脱离关系
iNoodles.desc();
/**考虑使用工厂模式
* 1) 当客户程序不需要知道要使用对象的创建过程。
* 2) 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
*/
}
}
工厂方法模式
工厂方法模式是比较复杂一点的工厂模式的体现,主要是通过创建工厂类来进行对对象的构建。
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
/**
* 工厂方法模式
*/
public interface INoodlesFactory {
INoodles createNoodles();
}
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
public class LzINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new LzNoodles();
}
}
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.PaoNoodles;
public class PaoINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new PaoNoodles();
}
}
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.ReganNoodles;
public class ReganINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new ReganNoodles();
}
}
测试类
package designpattern.factory.factorymethod;
import designpattern.factory.simplefactory.noodles.INoodles;
public class Test {
public static void main(String[] args) {
INoodlesFactory noodlesFactory = new LzINoodlesFactory();
INoodles noodles = noodlesFactory.createNoodles();
noodles.desc();
}
}
代码实例:
设计模式demo