您现在的位置是:首页 > 编程 > 

【Java设计模式】008

2025-07-27 19:31:47
【Java设计模式】008 四、工厂方法模式 第二次梳理:“工厂方法模式”是对简单工厂模式的进一步抽象化,在简单工厂模式中,创建的多个不同的产品是交给一个工厂创建的,每增加一个产品都需要对工厂代码进行修改,违背了“开闭原则”,在这里我们将简单工厂进一步抽象,为每一个产品写一个具体的工厂,这些具体的工厂共同实现一个抽象工厂接口,并负责具体对象的创建过程。当需要创建对象的时候,直接new一个具体工厂类

【Java设计模式】008

四、工厂方法模式

第二次梳理:“工厂方法模式”是对简单工厂模式的进一步抽象化,在简单工厂模式中,创建的多个不同的产品是交给一个工厂创建的,每增加一个产品都需要对工厂代码进行修改,违背了“开闭原则”,在这里我们将简单工厂进一步抽象,为每一个产品写一个具体的工厂,这些具体的工厂共同实现一个抽象工厂接口,并负责具体对象的创建过程。当需要创建对象的时候,直接new一个具体工厂类出来(也不一定是直接new出来的,可以将这个工厂的全限定类名写在配置文件中,通过Class.forame()方法创建工厂对象,这样写可以在配置文件中修改具体工厂类),赋值给抽象工厂接口,然后调用创建对象的方法创建即可!工厂方法模式每次新增一个对象不需要修改原代码,只需要新增一个工厂即可!遵循了“开闭原则”!时间:2021年05月1日 10时0分2秒

补充:通过Class.forame()方法创建工厂对象代码示例时间:2021年05月1日 10时9分14秒

代码语言:javascript代码运行次数:0运行复制
// DogFactory dogFactory = new DogFactoryImpl(); // 原始写法
Class<?> forame = Class.forame("com.zibo.DogFactoryImpl");
DogFactory dogFactory = (DogFactory)();

一个抽象工厂,多个具体工厂,每个工厂生产一种产品!时间:2021年05月1日 11时24分17秒

1、概述

简单讲:抽象工厂提供创建产品的接口,每一个具体工厂创建一种具体的产品,使用者根据具体工厂,得到具体产品;

“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则;

满足开闭原则:当新增一个产品的时候只需要添加一个新的具体工厂,不需要修改原始代码;

2、应用场景

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等;
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口;
  • 客户不关心创建产品的细节,只关心产品的品牌;

、优缺点

优点
  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类;
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则;
缺点
  • 类的个数容易过多,增加复杂度;
  • 增加了系统的抽象性和理解难度;
  • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决;

4、主要角

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品;
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建;
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能;
  • 具体产品(Concrete Product):实现了抽象产品角所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应;

5、代码实现

功能类
代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

// 抽象产品
public interface Dog{
    void sleep();
}

// 抽象工厂
interface DogFactory{
    Dog create();
}

// 具体工厂1
class BigDogFactory implements DogFactory{
    public Dog create(){
        return new BigDog();
    }
}

// 具体工厂2
class LittleDogFactory implements DogFactory{
    public Dog create(){
        return new LittleDog();
    }
}

// 具体产品1
class BigDog implements Dog {
    @Override
    public void sleep() {
        println("大狗在睡觉!");
    }
}

// 具体产品2
class LittleDog implements Dog {
    @Override
    public void sleep() {
        println("小狗在睡觉!");
    }
}
测试类
代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

public class Test {
    public static void main(String[] args) {
        BigDogFactory bigDogFactory = new BigDogFactory();
        ().sleep();
        LittleDogFactory littleDogFactory = new LittleDogFactory();
        ().sleep();
    }
}
运行结果
代码语言:javascript代码运行次数:0运行复制
大狗在睡觉!
小狗在睡觉!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除java产品对象接口设计模式

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1200659.html

相关标签:无
上传时间: 2025-07-23 19:38:14

上一篇:【Java设计模式】009

下一篇:WinRar注册码

留言与评论(共有 5 条评论)
本站网友 世茂百货
26分钟前 发表
只需要新增一个工厂即可!遵循了“开闭原则”!时间:2021年05月1日 10时0分2秒 补充:通过Class.forame()方法创建工厂对象代码示例时间:2021年05月1日 10时9分14秒代码语言:javascript代码运行次数:0运行复制// DogFactory dogFactory = new DogFactoryImpl(); // 原始写法 Class<?> forame = Class.forame("com.zibo.DogFactoryImpl"); DogFactory dogFactory = (DogFactory)(); 一个抽象工厂
本站网友 产后健康减肥方法
5分钟前 发表
可以将这个工厂的全限定类名写在配置文件中
本站网友 注射去皱
30分钟前 发表
代码实现功能类代码语言:javascript代码运行次数:0运行复制package com.zibo.; // 抽象产品 public interface Dog{ void sleep(); } // 抽象工厂 interface DogFactory{ Dog create(); } // 具体工厂1 class BigDogFactory implements DogFactory{ public Dog create(){ return new BigDog(); } } // 具体工厂2 class LittleDogFactory implements DogFactory{ public Dog create(){ return new LittleDog(); } } // 具体产品1 class BigDog implements Dog { @Override public void sleep() { println("大狗在睡觉!"); } } // 具体产品2 class LittleDog implements Dog { @Override public void sleep() { println("小狗在睡觉!"); } }测试类代码语言:javascript代码运行次数:0运行复制package com.zibo.; public class Test { public static void main(String[] args) { BigDogFactory bigDogFactory = new BigDogFactory(); ().sleep(); LittleDogFactory littleDogFactory = new LittleDogFactory(); ().sleep(); } }运行结果代码语言:javascript代码运行次数:0运行复制大狗在睡觉! 小狗在睡觉!本文参与 腾讯云自媒体同步曝光计划
本站网友 环境监测站
16分钟前 发表
直接new一个具体工厂类出来(也不一定是直接new出来的