设计模式之简单工厂模式

简单工厂模式

**

一、模式定义

**
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式
在简单工厂模式中,可以根据参数的不同返回不同类的实例
简单工厂模式专门定义一个类(工厂)来负责创建其他类的实例(具体实例),被创建的实例通常都具有共同的父类(抽象接口)

乍一看定义是不是有些懵呢,刚开始都是这样的,但是随着你不断的了解就会发现其实也不是很难!
这里我用女娲造人来给大家解释一下(听起来可能有些奇异但是思路很清晰呀)

工厂:女娲
抽象接口:人
具体实例:男人,女人,机器人

工厂工厂就是利用一个工厂来生产东西,你不需要知道它的生产步骤,只需要给它一个命令。比如,女娲大人,赐我一个女朋友吧,把女朋友这个参数传给女娲后,女娲就会返回一个女朋友给你!惊不惊喜,意不意外!

二、具体实现

这里我们利用Java实现这个设计模式:
(1)创建抽象接口(人),具体不知道是男是女。
抽象方法可以写一个public void birthday()
(2)创建工厂(女娲),生产男人女人
实现方法:public static human productperson(String type)
这里用静态修饰,是为了将来用类名直接调用函数,参数就是告诉女娲,生产男还是生产女!
(3)创建具体实例(男人,女人):
接口的实现类,实现抽象方法
下面用类图表示各个类与接口之间的关系:
设计模式之简单工厂模式
如果不懂箭头的含义:可以搜索一下类图
或者:
设计模式之简单工厂模式
一旦创建好了各种类你就会发现在调用的时候,只需要传入参数,然后工厂就返回一个接口实例对象!
然后调用这个实例对象的方法,证明它被创造出来了。

设计模式之简单工厂模式
发现没有,human是接口,但是nuwa.productperson(type)返回的是一个接口实例化类,所以下面调用了birthday()方法,调用的是实例化类的birthday()方法。
productperson()代码:
设计模式之简单工厂模式
图中有robot()读者可以想象成另一种人机器人,也是接口的实例化对象,所一说这个工厂返回了一个实例化对象。
但是这也就造成了工厂的职责过重,生产各种人,一旦要添加一个新品种的人类,就必须对工厂进行改动,robot就是我新加的人,这样就违反了开闭原则!

总结:
简单工厂模式优点
1.实现了对象创建和使用的分离。
2.客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
简单工厂模式缺点:
1.工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
2.增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。
3.系统扩展困难,一旦添加新产品不得不修改工厂逻辑。
4.由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展。

三、参考代码

human:

package simplefactory;

public interface human{
    public void brithday();
}

woman:

package simplefactory;

public class woman implements human {
    @Override
    public void brithday() {
        System.out.println("小姐姐出生了!");
    }
}

man:

package simplefactory;

public class man implements human {
    @Override
    public void brithday() {
        System.out.println("小哥哥出生了!");
    }
}

robot:

package simplefactory;

public class robot implements human{
    @Override
    //新增代码
    public void brithday() {
        System.out.println("机器人造出来了!");
    }
}

nvwa(代码中mvwa打错了打成了nuwa):

package simplefactory;
//女娲相当于一个工厂
public class nuwa {
    public static human produceperson(String racial){
        if(racial.equalsIgnoreCase("m")){
            return new man();
        }
        else if(racial.equalsIgnoreCase("w")){
            return new woman();
        }
        //这里进行了大量改动,简单工厂模式中工厂职责过重
        else if(racial.equalsIgnoreCase("r")){
            return new robot();
        }
        else{
            System.out.println("没有造出人类!");
            return null;
        }
    }
}

client(客户端):

package simplefactory;

import java.util.Scanner;

public class client {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String type = input.next();
        human human;
        human = nuwa.produceperson(type);
        human.brithday();
        input.close();
    }
}

参考代码效果会更好!