《设计模式入门》 1.简单工厂模式

本文介绍了简单工厂模式,作为设计模式的基础,它通过工厂类根据输入参数创建相应的产品对象。文中以手机为例,展示了如何创建华为P50、小米11U和苹果iPhone13ProMax的抽象类、产品类和工厂类。尽管简单工厂模式降低了客户端的耦合性,但它违反了开闭原则,当增加新产品时需修改工厂类,存在一定的局限性。
摘要由CSDN通过智能技术生成

        简单工厂模式(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();
    }
}

        就可以生成对应的手机并且试实现方法了。

 =======================================================================

优缺点:

优点:不直接在客户端创建具体产品的实例,降低了耦合性。

缺点:违反了开闭原则,(对扩展开放,对修改关闭),不容易形成高内聚松耦合结构。 每当我们增加一种产品的时候就要去修改工厂方法,这样会破坏其内聚性,给维护带来额外开支。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PigeonEssence

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值