什么是工厂模式
工厂模式(FactoryPattern),在面向对象程序设计中,工厂通常是用来创建其他对象的对象。
在工厂模式中,创建对象时,不会对客户端暴露创建逻辑,是通过一个共同的接口来指向新创建的对象。
工厂模式分为:
- 普通工厂模式
- 多个工厂方法模式
- 静态工厂方法模式
普通工厂模式
为了方便理解,我们以人为例子,有一个工厂可以创建人。先创建一个男人,他每天都会"吃饭,睡觉,打豆豆",再创建一个女人,她也会"吃饭,睡觉,打豆豆"。
Interface : void eat(); void sleep(); void beat();
Class Male: void eat(); void sleep(); void beat();
Class Female: void eat(); void sleep(); void beat();
Class HumanFactory: createHuman(String ) : Human
示例代码
public interface Human {
public void eat();
public void sleep();
public void beat();
}
public class Male implements Human{
@Override
public void eat() {
System.out.println("Male can eat.");
}
@Override
public void sleep() {
System.out.println("Male can sleep.");
}
@Override
public void beat() {
System.out.println("Male can beat.");
}
}
public class Female implements Human{
@Override
public void eat() {
System.out.println("Female can eat.");
}
@Override
public void sleep() {
System.out.println("Female can sleep.");
}
@Override
public void beat() {
System.out.println("Female can beat.");
}
}
public class HumanFactory {
// 普通工厂模式
public Human createHuman(String gender) {
if (gender.equals("male")) {
return new Male();
} else if (gender.equals("female")) {
return new Female();
} else {
System.out.println("请输入正确的类型");
return null;
}
}
}
public class FactoryTest {
public static void main(String[] agrs) {
HumanFactory factory = new HumanFactory();
Human male = factory.createHuman("male");
male.eat();
male.sleep();
male.beat();
}
}
运行结果:
多个方法工厂模式
在上面的普通工厂模式中,我们看到,如果创建人时,传递的字符串出错,则不能正确创建对象,所以就有了多个方法工厂模式,提供多个工厂方法,分别创建对象。
示例代码
public class HumanFactory {
//多个工厂方法模式
public Male createMale() {
return new Male();
}
public Female createFemale() {
return new Female();
}
}
public class FactoryTest {
public static void main(String[] agrs) {
HumanFactory factory = new HumanFactory();
Male male = factory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
运行结果:
静态工厂方法模式
如果将上面多个方法工厂的模式里的方法改为静态方法,则不需要创建实例,直接调用即可。
示例代码
public class HumanFactory {
// 静态工厂方法模式
public static Male createMale() {
return new Male();
}
public static Female createFemale() {
return new Female();
}
}
public class FactoryTest {
public static void main(String[] agrs) {
Human female = HumanFactory.createFemale();
female.eat();
female.sleep();
female.beat();
}
}
运行结果:
总结
那么我们在什么时候需要使用工厂模式呢?
当需要创建多个产品时,且具有共同的接口时。通过上面的对比,静态工厂方法模式使用起来比较方便,高效。所以我们经常会使用它。
工厂模式的实际应用
Calender对象
java.util.Calender - getINstance()
java.util.Calendar - getInstance(TimeZone zone)
java.util.Calendar - getInstance(Locale aLocale)
java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
java.text.NumberFormat - getInstance()
java.text.NumberFormat - getInstance(Locale inLocale)
Android的程序员,应该会比较熟悉BitmapFactory,也是工厂模式一种应用。
好了,工厂模式的介绍到此告一段落了~