JAVA设计模式第九章:工厂模式

设计模式-工厂模式

一. 什么是工厂模式

1.1 什么是工厂模式

工厂模式的出现是为了解决创建对象实例的问题,通常我们使用new关键字创建某个对象,但在特定的情况下,一个对象的创建需要一些列的步骤,依赖其它的模块对象,所以这类对象的创建更像是一个过程,而非单个动作。这与工厂的工作模式极为相似,工厂中制造一个部手机,比如要从全国各地购买零部件,然后组装为一部手机,而这个组装的过程,就是工厂模式的组件手机的过程。

工厂模式利用了面向对象的封装特点,对外屏蔽实现过程

二. 为什么需要工厂模式

  1. 代码创建逻辑和使用进行分离,使用对象是不关心创建过程;
  2. 提供扩展机制 后续增加产品之需实现对应接口即可,无需改动之前代码;

三. 3种工厂模式的实现

以手机制造为例: 小米手机 苹果手机

3.1 简单工厂模式

/**
 * 手机产品抽象类
 */
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

3.2 工厂方法模式

/**
 * 手机产品抽象类
 */
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

3.3 抽象工厂模式

/**
 * 手机产品抽象类
 */
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

四. 总结

4.1 简单工厂模式

特征

  1. 没有抽象工厂
  2. 一个具体工厂实现
  3. 多个产品实现
  4. 一个工厂生产一种产品

优势

  1. 简单 编写简单 使用也简单
  2. 对象创建解耦,之需知道对象的名称即可创建对象

劣势

  1. 违反开闭原则
  2. 扩展性差

4.2 工厂方法模式

特征

  1. 一个抽象工厂
  2. 多个具体工厂实现
  3. 多个产品实现
  4. 一个工厂生产一种产品

优势

  1. 对比简单工厂模式扩展性增强
  2. 符合开闭原则

劣势

  1. 创建具体的产品需要对应的工厂,增加了使用复杂度

4.2 抽象工厂模式

特征

  1. 一个抽象工厂
  2. 多个具体工厂实现
  3. 多个产品实现
  4. 一个工厂生产多种产品

优势

  1. 扩展性强,增加产品型号方便
  2. 产品簇配套降低出错率

劣势

  1. 增加产品零件非常复杂 需要修改 工厂抽象类 工厂抽象类实现 产品和对应的实现都需要修改
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值