【Java设计模式】008
【Java设计模式】008
四、工厂方法模式 第二次梳理:“工厂方法模式”是对简单工厂模式的进一步抽象化,在简单工厂模式中,创建的多个不同的产品是交给一个工厂创建的,每增加一个产品都需要对工厂代码进行修改,违背了“开闭原则”,在这里我们将简单工厂进一步抽象,为每一个产品写一个具体的工厂,这些具体的工厂共同实现一个抽象工厂接口,并负责具体对象的创建过程。当需要创建对象的时候,直接new一个具体工厂类
【Java设计模式】008
第二次梳理:“工厂方法模式”是对简单工厂模式的进一步抽象化,在简单工厂模式中,创建的多个不同的产品是交给一个工厂创建的,每增加一个产品都需要对工厂代码进行修改,违背了“开闭原则”,在这里我们将简单工厂进一步抽象,为每一个产品写一个具体的工厂,这些具体的工厂共同实现一个抽象工厂接口,并负责具体对象的创建过程。当需要创建对象的时候,直接new一个具体工厂类出来(也不一定是直接new出来的,可以将这个工厂的全限定类名写在配置文件中,通过
Class.forame()
方法创建工厂对象,这样写可以在配置文件中修改具体工厂类),赋值给抽象工厂接口,然后调用创建对象的方法创建即可!工厂方法模式每次新增一个对象不需要修改原代码,只需要新增一个工厂即可!遵循了“开闭原则”!时间:2021年05月1日 10时0分2秒
补充:通过Class.forame()
方法创建工厂对象代码示例时间:2021年05月1日 10时9分14秒
// 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组装电脑配置单推荐报价格
上传时间: 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出来的 |