工厂模式的出现是为了解决创建对象实例的问题,通常我们使用new关键字创建某个对象,但在特定的情况下,一个对象的创建需要一些列的步骤,依赖其它的模块对象,所以这类对象的创建更像是一个过程,而非单个动作。这与工厂的工作模式极为相似,工厂中制造一个部手机,比如要从全国各地购买零部件,然后组装为一部手机,而这个组装的过程,就是工厂模式的组件手机的过程。
工厂模式利用了面向对象的封装特点,对外屏蔽实现过程。
以手机制造为例: 小米手机 苹果手机
/**
* 手机产品抽象类
*/
public interface Phone {
/**
* 产品信息
* @return
*/
String information();
}
/**
* 苹果手机实现
*
* @author cans
* @date 2024/2/17
**/
public class Iphone implements Phone {
@Override
public String information() {
return "Iphone 15 Pro Max";
}
}
/**
* 小米手机实现
*
* @author cans
* @date 2024/2/17
**/
public class Mihone implements Phone {
@Override
public String information() {
return "小米 14";
}
}
/**
* 工厂模式 - 简单工厂
*/
public class FactoryImpl {
/**
* 获取实现
* @param name
* @return
*/
public Phone getInstanceByName(String name){
if(Objects.equals("iphone",name)){
return new Iphone();
}else if(Objects.equals("xiaomi",name)){
return new Mihone();
}
return null;
}
}
测试代码
public static void main(String[] args) {
String iphone = "iphone";
String xiaomi = "xiaomi";
FactoryImpl factory = new FactoryImpl();
Phone iphoneInstance = factory.getInstanceByName(iphone);
System.out.println(iphoneInstance.information());
Phone xiaomiInstance = factory.getInstanceByName(xiaomi);
System.out.println(xiaomiInstance.information());
}
输出:
Iphone 15 Pro Max
小米 14
Process finished with exit code 0
/**
* 手机产品抽象类
*/
public interface Phone {
/**
* 产品信息
* @return
*/
String information();
}
/**
* 小米手机实现
*
* @author cans
* @date 2024/2/17
**/
public class MiPhone implements Phone {
@Override
public String information() {
return "小米 14";
}
}
/**
* 苹果手机实现
*
* @author cans
* @date 2024/2/17
**/
public class IPhone implements Phone {
@Override
public String information() {
return "Iphone 15 Pro Max";
}
}
/**
* 工厂模式 - 工厂方法
*/
public interface Factory {
Phone getInstance();
}
/**
* @author cans
* @date 2024/2/17
**/
public class MiPhoneFactoryImpl implements Factory{
@Override
public MiPhone getInstance() {
return new MiPhone();
}
}
/**
* @author cans
* @date 2024/2/17
**/
public class IPhoneFactoryImpl implements Factory {
@Override
public IPhone getInstance() {
return new IPhone();
}
}
测试类
/**
* 工厂模式 - 工厂方法测试
*
* @author cans
* @date 2024/2/17
**/
public class FactoryTest {
@Test
public void factoryMethod() {
IPhoneFactoryImpl iPhoneFactory = new IPhoneFactoryImpl();
IPhone iPhoneInstance = iPhoneFactory.getInstance();
System.out.println(iPhoneInstance.information());
MiPhoneFactoryImpl miPhoneFactory = new MiPhoneFactoryImpl();
MiPhone miPhoneInstance = miPhoneFactory.getInstance();
System.out.println(miPhoneInstance.information());
}
}
输出:
Iphone 15 Pro Max
小米 14
Process finished with exit code 0
/**
* 手机产品抽象类
*/
public interface Phone {
/**
* 产品信息
* @return
*/
String information();
}
/**
* 手机使用CPU - 抽象类
* @author cans
* @date 2024/2/17
**/
public interface Cpu {
String getName();
}
/**
* 抽象工厂 - A15CPU
*
* @author cans
* @date 2024/2/17
**/
public class A15Cpu implements Cpu {
@Override
public String getName() {
return "A15";
}
}
/**
* 抽象工厂 - 小米澎湃CPU
* @author cans
* @date 2024/2/17
**/
public class SurgingCpu implements Cpu{
@Override
public String getName() {
return "澎湃S1";
}
}
/**
* 工厂模式 - 抽象工厂
*/
public interface Factory {
/**
* 生产手机
*
* @return
*/
Phone createPhone();
/**
* 生产CPU
* @return
*/
Cpu createCpu();
}
/**
* 苹果手机 -抽象工厂实现
*
* @author cans
* @date 2024/2/17
**/
public class IPhoneFactoryImpl implements Factory {
@Override
public IPhone createPhone() {
return new IPhone(createCpu());
}
@Override
public Cpu createCpu() {
return new A15Cpu();
}
}
/**
* 小米手机 - 抽象工厂实现
*
* @author cans
* @date 2024/2/17
**/
public class MiPhoneFactoryImpl implements Factory {
@Override
public MiPhone createPhone() {
return new MiPhone(createCpu());
}
@Override
public Cpu createCpu() {
return new SurgingCpu();
}
}
测试类:
/**
* 抽象工厂 - 测试类
*
* @author cans
* @date 2024/2/17
**/
public class AbstractFactoryTest {
@Test
public void factoryTest() {
IPhoneFactoryImpl iPhoneFactory = new IPhoneFactoryImpl();
IPhone iPhone = iPhoneFactory.createPhone();
System.out.println(iPhone.information());
MiPhoneFactoryImpl miPhoneFactory = new MiPhoneFactoryImpl();
MiPhone miPhone = miPhoneFactory.createPhone();
System.out.println(miPhone.information());
}
}
输出:
iphone usr CPU:A15
xiaomi usr CPU:澎湃S1
Process finished with exit code 0
更多【jvm-JAVA设计模式第九章:工厂模式】相关视频教程:www.yxfzedu.com