【设计模式】通过在京东上购买手机了解工厂方法模式

今日电商 京东电商 2 0

背景

买1个苹果手机(Product A),可以到苹果京东自营旗舰店(ConcreteCreator A)中买;

【设计模式】通过在京东上购买手机了解工厂方法模式-第1张图片-周小辉博客

买1个三星手机(Product B),可以到三星京东自营旗舰店(ConcreteCreator B)中买;

【设计模式】通过在京东上购买手机了解工厂方法模式-第2张图片-周小辉博客

模式定义

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

定义用于创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。

模式结构

【设计模式】通过在京东上购买手机了解工厂方法模式-第3张图片-周小辉博客

模式实现

产品

手机接口定义

package com.example.designpattern.factorymethod.product;
/**
 * 手机
 *
 * @author hongcunlin
 */
public interface Phone {
    /**
     * 拨号
     */
    void call();
}

苹果手机实现

package com.example.designpattern.factorymethod.product.impl;
import com.example.designpattern.abstractfactory.product.phone.Phone;
/**
 * 苹果手机
 *
 * @author hongcunlin
 */
public class ApplePhone implements Phone {
    @Override
    public void call() {
        System.out.println("正在使用苹果手机拨号中...");
    }
}

三星手机实现

package com.example.designpattern.factorymethod.product.impl;
import com.example.designpattern.abstractfactory.product.phone.Phone;
/**
 * 三星手机
 *
 * @author hongcunlin
 */
public class SamsungPhone implements Phone {
    @Override
    public void call() {
        System.out.println("正在使用三星手机拨号中...");
    }
}

工厂

手机工厂接口定义

package com.example.designpattern.factorymethod.factory;
import com.example.designpattern.abstractfactory.product.phone.Phone;
/**
 * 工厂抽象
 *
 * @author hongcunlin
 */
public interface PhoneFactory {
    /**
     * 创建手机
     *
     * @return 手机
     */
    public abstract Phone createPhone();
}

苹果手机工厂实现

package com.example.designpattern.factorymethod.factory.impl;
import com.example.designpattern.abstractfactory.product.phone.Phone;
import com.example.designpattern.factorymethod.factory.PhoneFactory;
import com.example.designpattern.factorymethod.product.impl.ApplePhone;
/**
 * 苹果工厂
 *
 * @author hongcunlin
 */
public class ApplePhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        return new ApplePhone();
    }
}

三星手机工厂实现

package com.example.designpattern.factorymethod.factory.impl;
import com.example.designpattern.abstractfactory.product.phone.Phone;
import com.example.designpattern.factorymethod.factory.PhoneFactory;
import com.example.designpattern.factorymethod.product.impl.SamsungPhone;
/**
 * 三星工厂
 *
 * @author hongcunlin
 */
public class SamsungPhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        return new SamsungPhone();
    }
}

测试

package com.example.designpattern.factorymethod;
import com.example.designpattern.abstractfactory.product.phone.Phone;
import com.example.designpattern.factorymethod.factory.PhoneFactory;
import com.example.designpattern.factorymethod.factory.impl.ApplePhoneFactory;
import com.example.designpattern.factorymethod.factory.impl.SamsungPhoneFactory;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
 * @author hongcunlin
 */
@SpringBootTest
public class DesignPatternTest {
    @Test
    public void test() {
        PhoneFactory phoneFactory = new ApplePhoneFactory();
        buyAndUseProduct(phoneFactory);
        phoneFactory = new SamsungPhoneFactory();
        buyAndUseProduct(phoneFactory);
    }
    /**
     * 购买和使用产品
     *
     * @param phoneFactory 工厂
     */
    private void buyAndUseProduct(PhoneFactory phoneFactory) {
        Phone phone = phoneFactory.createPhone();
        phone.call();
    }
}

可以看到从手机工厂中获取的手机产品,都是可以正常使用的

【设计模式】通过在京东上购买手机了解工厂方法模式-第4张图片-周小辉博客

回顾

本问题通过在电商购买产品的流程,抽象了一个工厂方法的设计模式理念,相当好理解,就像手机取之不尽,而各大旗舰店就类似一个个的工厂。

与之类似的还有抽象工厂,有空再闲聊。

标签: 设计模式 iPhone 京东商城 三星集团 2019科技之光

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~