• 设计模式---工厂模式(创建型)


    目录

    1、什么是工厂设计模式

    2、简单工厂模式

     3、工厂方法设计模式

    4、抽象工厂模式


    1、什么是工厂设计模式

            工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。

            工厂模式是用工厂方法代替new操作的一种模式。我们不暴露创建对象的具体逻辑,而是将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。

    2、简单工厂模式

            该模式对对象创建管理方式最为简单,只需要对不同类对象的创建进行了一层薄薄的封装即可,即通过向工厂传递类型来指定要创建的对象。

    代码实现:

            首先创建一个华为手机的接口:

    1. public interface HuaweiPhone {
    2. /**
    3. * 打电话
    4. */
    5. void call();
    6. }

            创建华为Mate50和P50:

    1. public class Mate50 implements HuaweiPhone{
    2. public Mate50(){
    3. System.out.println("创建一个Mate50很复杂");
    4. }
    5. /**
    6. * 打电话
    7. */
    8. public void call() {
    9. System.out.println("使用Mate50打电话");
    10. }
    11. }
    1. public class P50 implements HuaweiPhone {
    2. public P50(){
    3. System.out.println("创建p50是一个很复杂的过程");
    4. }
    5. /**
    6. * 打电话
    7. */
    8. public void call() {
    9. System.out.println("使用P50打电话");
    10. }
    11. }

            创建制造华为手机的工厂类:

    1. //创建华为手机的工厂
    2. public class HuaWeiPhoneFactory {
    3. public HuaweiPhone makeHuaei(String tpye){
    4. if("Mate50".equals(tpye))
    5. {
    6. //创建Mate50对象是复杂的 省略一万行
    7. return new Mate50();
    8. } else if("P50".equals(tpye)){
    9. //创建P50对象是复杂的 省略一万行
    10. return new P50();
    11. }else {
    12. throw new RuntimeException("该类型的手机不存在!");
    13. }
    14. }
    15. }

            测试:

    1. public class phoneMain {
    2. public static void main(String[] args) {
    3. HuaWeiPhoneFactory factory=new HuaWeiPhoneFactory();
    4. P50 p50 = (P50) factory.makeHuaei("P50");
    5. p50.call();
    6. System.out.println("-------------------");
    7. Mate50 mate50 = (Mate50)factory.makeHuaei("Mate50");
    8. mate50.call();
    9. System.out.println("-------------------");
    10. HuaweiPhone iphone13 = factory.makeHuaei("iphone13");
    11. iphone13.call();
    12. }
    13. }

    缺点:简单工厂模式是违反“开闭原则“;因为如果要新增产品,就需要修改工厂类的代码。

    比如我要新增一个Nova10手机,此时就需要改HuaWeiPhoneFactory的代码。

     3、工厂方法设计模式

          提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例        

            简单工厂模式中 工厂 负责的是生产所有产品,而工厂方法模式将生产不同产品的任务分发给不同的工厂,正所谓各司其职,减少依赖性。比如华为Mate50工厂就专门生产Mate50系列的手机,P50就生产P50系列的手机。既然工厂要不同,那就得把工厂抽象出来,具体的厂商自己实现。

    代码实现:

            将上面的HuaWeiPhoneFactory 的工厂抽取出来:

            工厂接口:

    1. /**
    2. * 生产华为手机的工厂接口
    3. */
    4. public interface Factory {
    5. /**
    6. * 生产华为手机
    7. * @return
    8. */
    9. HuaweiPhone makeHuaWei();
    10. }

            生产Mate50的工厂:

    1. /**
    2. * Mate50工厂
    3. */
    4. public class Mate50Factory implements Factory {
    5. /**
    6. * 生产华为Mate50
    7. *
    8. * @return
    9. */
    10. public HuaweiPhone makeHuaWei() {
    11. //经过一系列的复杂过程
    12. return new Mate50();
    13. }
    14. }

            生产P50的工厂: 

    1. /**
    2. * P50工厂
    3. */
    4. public class P50Factory implements Factory{
    5. /**
    6. * 生产华为P50
    7. *
    8. * @return
    9. */
    10. public HuaweiPhone makeHuaWei() {
    11. return new P50();
    12. }
    13. }

            测试:

    1. public class phoneMain {
    2. public static void main(String[] args) {
    3. //创建Mate50工厂
    4. Factory factory=new Mate50Factory();
    5. HuaweiPhone mate50 = factory.makeHuaWei();
    6. mate50.call();
    7. System.out.println("------------------------");
    8. Factory factory1=new P50Factory();
    9. HuaweiPhone p50 = factory1.makeHuaWei();
    10. p50.call();
    11. }
    12. }

            每个工厂只生产一种产品 ,此时如果想生产一个 Navo10手机就不需要改HuaWeiPhoneFactory的代码。只需要添加Navo10的产品和Navo的工厂。

    4、抽象工厂模式

            他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品;而抽象工厂模式则是针对的多个产品。即工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类

    代码实现:

    1、定义产品抽象类

            电脑生产线:

    1. public abstract class AbstractComputerProduct {
    2. // 生产电脑产品的共享方法
    3. public void sharedMethod(){
    4. System.out.println("这是生产电脑的产品线。");
    5. }
    6. abstract void networking();
    7. }

            手机生产线:

    1. public abstract class AbstractPhoneProduct {
    2. // 添加loge标签
    3. public void labelling(){
    4. System.out.println("这是小米的产品。");
    5. }
    6. abstract void networking();
    7. }

     2、定义具体产品    

            我们定义两个华为的产品

    1. public class MateBook16 extends AbstractComputerProduct {
    2. @Override
    3. public void networking() {
    4. System.out.println("Use a mateBook16 to connect to the Internet");
    5. }
    6. }
    1. public class Mate60 extends AbstractPhoneProduct {
    2. @Override
    3. public void networking() {
    4. System.out.println("Use a Mate60 to connect to the Internet");
    5. }
    6. }

            定义两个小米的产品

    1. public class Mi12 extends AbstractPhoneProduct {
    2. @Override
    3. public void networking() {
    4. System.out.println("Use a Mi12 to connect to the Internet");
    5. }
    6. }
    1. public class MiBookPro15 extends AbstractComputerProduct {
    2. @Override
    3. public void networking() {
    4. System.out.println("Use a MiBookPro15 to connect to the Internet");
    5. }
    6. }

     3、定义抽象工厂

    1. public abstract class AbstractFactory {
    2. /**
    3. * 生产手机的方法
    4. * @return
    5. */
    6. abstract AbstractPhoneProduct createPhone();
    7. /**
    8. * 生产电脑的方法
    9. * @return
    10. */
    11. abstract AbstractComputerProduct createComputer();
    12. }

    4、定义具体的产品工厂

            小米产品线的工厂:

    1. public class MiFactory extends AbstractFactory {
    2. @Override
    3. AbstractPhoneProduct createPhone() {
    4. return new Mi12();
    5. }
    6. @Override
    7. AbstractComputerProduct createComputer() {
    8. return new MiBookPro15();
    9. }
    10. }

            华为产品线的工厂 :

    1. public class HuaweiFactory extends AbstractFactory {
    2. @Override
    3. AbstractPhoneProduct createPhone() {
    4. return new Mate60();
    5. }
    6. @Override
    7. AbstractComputerProduct createComputer() {
    8. return new MateBook16();
    9. }
    10. }

    5、测试

    1. public class Client {
    2. public static void main(String[] args) {
    3. AbstractFactory factory = new MiFactory();
    4. AbstractPhoneProduct phone = factory.createPhone();
    5. phone.networking();
    6. }
    7. }

            抽象工厂模式的缺点在于产品类的扩展,将会是十分费力的,假如需要加入新的产品,那么几乎所有的工厂类都需要进行修改,所以在使用抽象工厂模式时,对产品等级结构的划分是十分重要的。

  • 相关阅读:
    GSCoolink GSV6708 HDMI4to2 CrossSwitch
    《银行法律法规》三、银行管理——5、风险管理
    医保卡里的钱不用会被清零吗
    优化用户体验:解决element中el-tabs组件切换闪屏问题
    前端面试的话术集锦第 10 篇:高频考点(实现小型打包工具)
    柔性数组
    101页4万字数字孪生能源互联网智慧能源物联网大数据建设方案
    Mybatis-Plus:Sql 注⼊器、⾃动填充功能、逻辑删除
    Python-Django-Apache2.4-mod_wsgi-mysql-服务器生产环境配置
    【C#】解析和操作HTML文档,并进行同级或跨级匹配元素
  • 原文地址:https://blog.csdn.net/m0_46979453/article/details/126443089