简单工厂模式(Simple Factory Pattern)不属于GoF 23种设计模式,我们通常将它作为学习其他工厂模式的入门。是由一个工厂对象决定创建出哪一种产品类的实例。简单来说就是我们抽取一个产品的大类,用具体的产品继承大类并且实现具体的方法。
简单工厂模式一般抽象为三个板块:
1.工厂类
工厂类是简单工厂模式的核心,一般由一个具体的Java类进行实现,工厂类会在客户端的调用下创建具体的产品对象。
2.抽象类
抽象类一般都是产品类的父类,或者是共同拥有的接口,可以使用一个抽象类或者Java接口实现。
3.产品类
简单工厂模式创建的对象实例。
=========================================================================
我们来看一个简单工厂的例子:
------------------------------------------------
假设我们有一个工厂生产手机,我们有三种手机,分别是华为P50,小米12,还有苹果Iphone13 Pro Max,用户通过告诉我们对应的型号来拿到对应的手机。
-----------------------------------------------
抽象类
首先我们需要思考的是生产的产品,我们的目的是生产手机,那么不论是华为,小米,苹果,都是手机。那么我们就把手机作为一个抽象类抽象出来。
package Phones;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName Phones.Phone.java
* @Description 手机抽象方类,所有抽象方法在子类进行实现
* @createTime 2022年02月08日 17:27:00
*/
public abstract class Phone {
/**
*打电话功能抽象方法
*/
public abstract void call();
/**
*短信功能抽象方法
*/
public abstract void message();
/**
*游戏功能抽象方法
*/
public abstract void game();
}
产品类
我们拿到了抽象出来的大类,那么我们就可以创建具体的实现类来实现我们具体的方法了。
华为的实现类:
package Phones;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName MiPhone.java
* @Description 华为的实现类
* @createTime 2022年02月08日 17:02:00
*/
public class HuaWeiP50 extends Phone{
public HuaWeiP50(){
System.out.println("create HuaWeiP50");
}
@Override
public void call() {
System.out.println("di...di....di....");
}
@Override
public void message() {
System.out.println("Message: Hello Harmony");
}
@Override
public void game() {
System.out.println("WeGame Start");
}
}
苹果的实现类:
package Phones;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName IPhone.java
* @Description Iphone 的实现类
* @createTime 2022年02月08日 17:02:00
*/
public class IPhone13ProMax extends Phone {
public IPhone13ProMax(){
System.out.println("create iphone");
}
@Override
public void call() {
System.out.println("du....du....du....");
}
@Override
public void message() {
System.out.println("Imessage: Hello Iphone");
}
@Override
public void game() {
System.out.println("GameCenter Start");
}
}
小米的实现类:
package Phones;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName XiaoMi12.java
* @Description Mi11U的实现类
* @createTime 2022年02月08日 17:03:00
*/
public class XiaoMi11U extends Phone{
public XiaoMi11U(){
System.out.println("create XiaoMi11U");
}
@Override
public void call() {
System.out.println("da....da.....da....");
}
@Override
public void message() {
System.out.println("Message: Hello MIUI");
}
@Override
public void game() {
System.out.println("WIFI ERROR");
}
}
工厂类
工厂类的主要目的就是生产,所以就是通过对应的条件,创造出对应的手机。我们通过比较对应的字段,实现对应手机类的创建。
为了省事就直接抛出异常了。
package SimpleFactoryPattern.factory;
import Phones.HuaWeiP50;
import Phones.IPhone13ProMax;
import Phones.Phone;
import Phones.XiaoMi11U;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName SimpleFactoryPattern.factory.SimplePhoneFactory.java
* @Description 创建手机的工厂类,通过输入的参数创建对应的手机
* @createTime 2022年02月08日 17:01:00
*/
public class SimplePhoneFactory {
public static Phone makePhone(String type) throws Exception{
if (!type.isEmpty()){
switch (type) {
case "IPhone13ProMax":
return new IPhone13ProMax();
case "HuaWeiP50":
return new HuaWeiP50();
case "XiaoMi11U":
return new XiaoMi11U();
default:
System.out.println("Create Error: Error Type");
throw new Exception();
}
}else {
System.out.println("Create Error: No Type Identify");
throw new Exception();
}
}
}
主函数
主函数下,我们假设用户通过手机名称下订单生产手机:
package SimpleFactoryPattern;
import Phones.Phone;
import SimpleFactoryPattern.factory.SimplePhoneFactory;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName SimpleFactoryPattern.BuyPhone.java
* @Description 客户通过传入参数购买手机
* @createTime 2022年02月10日 16:13:00
*/
public class BuyPhone {
public static void main(String[] args) throws Exception {
String phoneType = "XiaoMi11U";
//创建手机
Phone phone = SimplePhoneFactory.makePhone(phoneType);
//实现对应方法
phone.call();
phone.game();
phone.message();
}
}
就可以生成对应的手机并且试实现方法了。
=======================================================================
优缺点:
优点:不直接在客户端创建具体产品的实例,降低了耦合性。
缺点:违反了开闭原则,(对扩展开放,对修改关闭),不容易形成高内聚松耦合结构。 每当我们增加一种产品的时候就要去修改工厂方法,这样会破坏其内聚性,给维护带来额外开支。