计算机应用技术网站建设,图片做旧网站,快速搭建房屋,龙岗外贸网站制作韩敬海 设计模式#xff08;Java版#xff09; #xff08;一#xff09;定义
定义一个创建对象的接口#xff0c;让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法涉及的角色有#xff1a; 1 .抽象工厂角色#xff1a;工厂方法模式的核心Java版 一定义
定义一个创建对象的接口让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法涉及的角色有 1 .抽象工厂角色工厂方法模式的核心与应用系统无关任何创建对象的工厂类必须实现这个接口。 2. 具体工厂角色实现了抽象工厂接口被应用程序调用以创建产品对象。 3. 抽象产品角色定义产品的共性实现对产品抽象的定义。 4. 具体产品角色实现抽象产品角色所声明的接口。
二类图 二代码实现
1. 抽象工厂角色
package com.xiaobai.design_pattern.factorymethod.createrole;import com.xiaobai.design_pattern.factorymethod.productrole.Cake;/*** author wangtw* ClassName Creator* description: 抽象工厂角色* date 2023/8/622:10*/
public interface Creator {Cake factory();
}
2. 抽象产品角色
package com.xiaobai.design_pattern.factorymethod.productrole;/*** author wangtw* ClassName Product* description: 抽象产品角色* date 2023/8/622:16*/
public interface Cake {/*** 获取蛋糕类型*/void make();
}
3. 具体工厂角色
1苹果蛋糕生成工厂
package com.xiaobai.design_pattern.factorymethod.createrole;import com.xiaobai.design_pattern.factorymethod.productrole.AppleCake;
import com.xiaobai.design_pattern.factorymethod.productrole.Cake;/*** author wangtw* ClassName AppleCakeCrator* description: 苹果蛋糕生成工厂具体工厂角色* date 2023/8/708:23*/
public class AppleCakeCreator implements Creator{Overridepublic Cake factory() {return new AppleCake();}
}
2草莓蛋糕生成工厂
package com.xiaobai.design_pattern.factorymethod.createrole;import com.xiaobai.design_pattern.factorymethod.productrole.Cake;
import com.xiaobai.design_pattern.factorymethod.productrole.StrawberryCake;/*** author wangtw* ClassName StrawberryCakeCrator* description: 草莓蛋糕生成工厂具体工厂角色* date 2023/8/708:24*/
public class StrawberryCakeCreator implements Creator{Overridepublic Cake factory() {return new StrawberryCake();}
}
4. 具体产品角色
1苹果蛋糕
package com.xiaobai.design_pattern.factorymethod.productrole;import lombok.extern.slf4j.Slf4j;/*** author wangtw* ClassName AppleCake* description: 苹果蛋糕具体产品角色* date 2023/8/707:56*/
Slf4j
public class AppleCake implements Cake{Overridepublic void make() { log.info(正在制作苹果蛋糕);}
}2草莓蛋糕
package com.xiaobai.design_pattern.factorymethod.productrole;import lombok.extern.slf4j.Slf4j;/*** author wangtw* ClassName StrawberryCakeProduct* description: 草莓蛋糕具体产品角色* date 2023/8/622:34*/
Slf4j
public class StrawberryCake implements Cake {Overridepublic void make() {log.info(正在制作草莓蛋糕);}
}5. 测试
package com.xiaobai.design_pattern.factorymethod;import com.xiaobai.design_pattern.factorymethod.createrole.AppleCakeCreator;
import com.xiaobai.design_pattern.factorymethod.createrole.Creator;
import com.xiaobai.design_pattern.factorymethod.createrole.StrawberryCakeCreator;
import com.xiaobai.design_pattern.factorymethod.productrole.AppleCake;
import com.xiaobai.design_pattern.factorymethod.productrole.Cake;
import org.junit.jupiter.api.Test;/*** author wangtw* ClassName FactoryMethodTest* description: 工厂方法模式测试类* date 2023/8/622:36*/
public class FactoryMethodTest {Testpublic void test() {// 草莓蛋糕生成Creator creator1 new StrawberryCakeCreator();Cake strawberryCake creator1.factory();strawberryCake.make();// 苹果蛋糕生成Creator creator2 new AppleCakeCreator();Cake appleCake creator2.factory();appleCake.make();}
}输出 22:58:45.924 [main] INFO com.xiaobai.design_pattern.factorymethod.productrole.StrawberryCake - 正在制作草莓蛋糕 22:58:45.929 [main] INFO com.xiaobai.design_pattern.factorymethod.productrole.AppleCake - 正在制作苹果蛋糕 三总结
1. 工厂方法模式优点
1提高扩展性在增加产品类的情况下只要适当调整具体的工厂类或扩展一个工厂类就可以适应变化。
2调用者不需要关心产品的具体实现只需要关注产品的接口是否发生变化因为产品的实例化是由工厂负责的。 3解耦高层模块只需要知道产品的抽象类不需要关注产品的实现类符合迪米特法则、依赖倒置原则、里氏替换原则。