我们在看一些源码时经常会看到xxxxFactory,这就是工厂模式了。面向对象的23种设计模式点这里。说工厂模式之前先说个段子:有个单身的java程序员,过年回家晚上睡着了。父母看着独生的儿子就着急说“你看也不小了,这没有对象怎么办”,程序员在梦中“随便new 一个”。这个怕是不好new,所以我们要找今天的婚姻介绍所:工厂模式。废话不说,代码伺候:
public class Factory {//简单工厂模式
abstract class 美女 {
abstract void 美女();//就一个方法,喊美女的时候会获得她
}
private class 萝莉美女 extends 美女 {
public void 美女() {
System.out.println("获得一个萝莉美女");
}
}
private class 御姐美女 extends 美女 {
public void 美女() {
System.out.println("获得一个御姐美女");
}
}
public static void main(String[] args) {
Factory factory = new Factory();
美女 萝莉 = factory.获取美女("萝莉");
萝莉.美女();
美女 御姐 = factory.获取美女("御姐");
御姐.美女();
}
萝莉美女 萝莉;
public 美女 获取美女(String type) {
switch (type) {
case "萝莉":
if (萝莉 == null) {//可以看到我们可以控制萝莉是否是单例,也可以控制她喜欢懒汉还是饿汉
萝莉 = new 萝莉美女();
}
return 萝莉;
case "御姐":
return new 御姐美女();
}
return null;
}
}
输出:
获得一个萝莉美女
获得一个御姐美女
我们要知道光萝莉美女还有很多种,为了简单我们只实现萝莉的工厂方法模式:
public class Factory {//工厂方法模式,可以看出是把简单工厂的工厂写成接口,以后加个霸道美女啥的。脸蛋什么的,是为了说明工厂模式的解耦。
abstract static class 美女 {
public String 脸蛋;
public String 身材;
public String 性格;
void 美女(){
System.out.println("脸蛋:" + 脸蛋);
System.out.println("身材:" + 身材);
System.out.println("性格:" + 性格);
}
}
private static class 萝莉美女 extends 美女 {
public void 美女() {
System.out.println("获得一个萝莉美女");
super.美女();
}
}
public static void main(String[] args) {
萝莉美女工厂 萝莉工厂 = new 萝莉美女工厂();
萝莉美女 萝莉 = 萝莉工厂.获取美女("闭月羞花", "娇小", "温柔");
萝莉.美女();
}
萝莉美女 萝莉;
interface 美女工厂 {
美女 获取美女(String 脸蛋, String 身材, String 性格);
}
public static class 萝莉美女工厂 implements 美女工厂 {
@Override
public 萝莉美女 获取美女(String 脸蛋, String 身材, String 性格) {
萝莉美女 萝莉 = new 萝莉美女();
//大家可能发现了,这三个赋值在这儿不好,因为御姐美女也要赋值。
//所以是在美女工厂里提供一个静态方法,还是在美女抽象类里提供构造方法。
//所进行的改动对外没有影响,这就是解耦。
萝莉.脸蛋 = 脸蛋;
萝莉.身材 = 身材;
萝莉.性格 = 性格;
return 萝莉;
}
}
}
输出:
获得一个萝莉美女
脸蛋:闭月羞花
身材:娇小
性格:温柔
可以看到我们把不同的脸蛋、身材的美女也获得了。但还有个问题,那就是萝莉身材不能是:大长腿,所以有了下面的抽象工厂模式。