背景
买1个苹果手机(Product A),可以到苹果京东自营旗舰店(ConcreteCreator A)中买;
买1个三星手机(Product B),可以到三星京东自营旗舰店(ConcreteCreator B)中买;
模式定义
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
定义用于创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。
模式结构
模式实现
产品
手机接口定义
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();
}
}
可以看到从手机工厂中获取的手机产品,都是可以正常使用的
回顾
本问题通过在电商购买产品的流程,抽象了一个工厂方法的设计模式理念,相当好理解,就像手机取之不尽,而各大旗舰店就类似一个个的工厂。
与之类似的还有抽象工厂,有空再闲聊。
标签: 设计模式 iPhone 京东商城 三星集团 2019科技之光
还木有评论哦,快来抢沙发吧~