【设计模式】 工厂方法模式

设计模式 工厂方法模式

工厂方法模式的思路

第一,创建产品规范,也就是产品接口
第二,根据产品规范设计真实的产品,也就是使产品类实现产品接口
第三,结合产品规范,创建工厂规范,也就是工厂接口或者抽象类,产品规范作为工厂中抽象方法(生产线)的参数
第四,根据工厂规范创建工厂,此时工厂可以生产产品了


举一个例子——生产手机

业务需求是,现在和将来一段时间要生产各种型号的手机。
所有的手机都满足手机的规范,比如包含打电话,上网,定位等功能。
现在,小米公司设计了小米手机,苹果公司设计了苹果手机,它们没有手机生产线。
有需求就有人做,富士康有大规模生产加工的经验和能力,它准备建立手机生产线。
只要给手机设计方案,富士康就能够产生出手机。
手机方案是满足手机规范的,工厂根据手机规范建设生产线。
生产线根据手机设计方案生产手机。

手机规范

public interface Phone {

    /**
     * 手机介绍自己的功能
     */
    void introduce();
}

手机产品设计方案

小米手机和苹果手机的设计方案

public class XiaomiPhone implements Phone {
    @Override
    public void introduce() {
        System.out.println("i am a xiaomi mobilephone");
    }
}


public class Iphone implements Phone {
    @Override
    public void introduce() {
        System.out.println("i am an iphone.");
    }
}

工厂规范

定义工厂的规范,工厂有一条手机生产线

public abstract class ExtractPhoneFactory {

    /**
     * 手机生产线
     * @param clazz 手机的设计方案
     * @param <T> 手机类型
     * @return 根据该类型手机的设计方案生产出来的手机
     */
    public abstract <T extends Phone> T createPhone(Class<T> clazz);
}

真实的工厂

public class PhoneFactory extends ExtractPhoneFactory {
    @Override
    public <T extends Phone> T createPhone(Class<T> clazz) {
        T phone = null;
        try{
            phone = (T)Class.forName(clazz.getName()).newInstance();
        } catch (Exception e){
            System.out.println("it goes wrong when creating phone.");
        }
        return phone;
    }
}

生产场景

当前,工厂可以生产小米手机和苹果手机

public class App {
    public static void main(String[] args){
        // 实例化工厂
        ExtractPhoneFactory phoneFactory = new PhoneFactory();

        // 为工厂的生产线 createPhone 传递一个手机设计方案 XiaomiPhone.class
        XiaomiPhone mi = phoneFactory.createPhone(XiaomiPhone.class);
        mi.introduce();

        Iphone iphone = phoneFactory.createPhone(Iphone.class);
        iphone.introduce();
    }
}

新的需求——生产华为手机

public class HuaweiPhone implements Phone {
    @Override
    public void introduce() {
        System.out.println("i am a huawei mobilephone.");
    }
}

新的生产场景

public class App {
    public static void main(String[] args){
        // 实例化工厂
        ExtractPhoneFactory phoneFactory = new PhoneFactory();

        // 为工厂的生产线 createPhone 传递一个手机设计方案 XiaomiPhone.class
        XiaomiPhone mi = phoneFactory.createPhone(XiaomiPhone.class);
        mi.introduce();

        Iphone iphone = phoneFactory.createPhone(Iphone.class);
        iphone.introduce();

        // 现在增加生产华为手机的业务,只需要创建一个实现了手机接口的手机设计方案类即可
        HuaweiPhone huawei = phoneFactory.createPhone(HuaweiPhone.class);
        huawei.introduce();
    }
}

解释

工厂方法模式命名非常准确。在工厂方法模式中,有两个主体,产品和工厂。
产品一定要满足产品规范,工厂通过产品规范来设计生产线,工厂通过产品设计方案生产产品。
一般地,工厂也需要满足工厂规范。


典型应用

JDBC 连接不同的数据库


为什么需要工厂模式

提高程序的可扩展性,降低程序之间的耦合程度。
比如,已经有一个生产手机的工厂,它可以生产小米手机、苹果手机,
现在工厂接到生产华为手机的订单。怎么办?
工厂只需要华为的手机设计即可,也就是定义一个实现了手机规范的化为手机类即可。


规范的作用

规范,也就是接口,或者是抽象类,
规范是各个模块通信的桥梁。它可以是各个具体模块之间耦合关系降低。


工厂方法模式的弱化——静态工厂模式

简单工厂模式,也就是静态工厂模式
我们省略掉工厂规范,并将实际的工厂类中的方法设置为静态类型,此时就是静态工厂模式。
静态工厂模式的缺点是,工厂类的扩展比较困难。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值