1.为什么要用工厂模式
@1实例化对象不希望公开进行(new)
@2初始化的耦合问题
@3当代吗出现大量具体类的时候,一旦加入新的具体类就必须修改原有代码
@4将实例化具体类的代码从应用中抽离或者封装起来,使他们不会干扰应用的其他部分
@5当要创建的对象很多或者以后要增加对象时,封装这些要创建对象的代码
2.分类:简单工厂模式,工厂方法模式,抽象工厂模式
3.代码实战:
@1要生产的对象超类:
1 package com.pattern.simplefactory; 2 /* 3 * 产品超类,披萨,每一种披萨都要经过下面的步骤卖给消费者 4 */ 5 public abstract class Pizze { 6 7 8 abstract void prepare();//准备 9 10 abstract void bake();//烘烤 11 12 /*切片*/ 13 abstract void cut(); 14 15 /*打包*/ 16 abstract void box(); 17 18 /*销售*/ 19 abstract void sale(); 20 21 }
@2对象超类的子类
1 package com.pattern.simplefactory; 2 3 /** 4 * 芝士披萨 5 * @author Administrator 6 * 7 */ 8 public class CheesePizze extends Pizze { 9 10 @Override 11 void prepare() { 12 System.out.println("cheesepizze prepare"); 13 14 } 15 16 @Override 17 void bake() { 18 System.out.println("cheesepizze bake"); 19 20 } 21 22 @Override 23 void cut() { 24 System.out.println("cheesepizze cut"); 25 26 } 27 28 @Override 29 void box() { 30 System.out.println("cheesepizze box"); 31 32 } 33 34 @Override 35 void sale() { 36 System.out.println("cheesepizze sale ten yuan"); 37 38 } 39 40 }
1 package com.pattern.simplefactory; 2 3 /** 4 * 番茄披萨 5 * @author Administrator 6 * 7 */ 8 public class VeggiePizze extends Pizze { 9 10 @Override 11 void prepare() { 12 System.out.println("veggiepizze prepare"); 13 14 } 15 16 @Override 17 void bake() { 18 System.out.println("veggiepizze bake"); 19 20 } 21 22 @Override 23 void cut() { 24 System.out.println("veggiepizze cut"); 25 26 } 27 28 @Override 29 void box() { 30 System.out.println("veggiepizze box"); 31 32 } 33 34 @Override 35 void sale() { 36 System.out.println("veggiepizze sale ten yuan"); 37 38 } 39 40 }
1 package com.pattern.simplefactory; 2 3 /** 4 * 沙拉披萨 5 * @author Administrator 6 * 7 */ 8 public class SalaPizze extends Pizze { 9 10 @Override 11 void prepare() { 12 System.out.println("salapizze prepare"); 13 14 } 15 16 @Override 17 void bake() { 18 System.out.println("salapizze bake"); 19 20 } 21 22 @Override 23 void cut() { 24 System.out.println("salapizze cut"); 25 26 } 27 28 @Override 29 void box() { 30 System.out.println("salapizze box"); 31 32 } 33 34 @Override 35 void sale() { 36 System.out.println("salapizze sale ten yuan"); 37 38 } 39 40 }
@3对象生产工厂,专门负责生产披萨对象,代替客户端去new对象
1 package com.pattern.simplefactory; 2 /* 3 * 披萨工厂,为所有披萨分装创建对象的代码,只做一件事即生产披萨对象 4 */ 5 public class SimplePizzeFactory { 6 7 public static Pizze createPizze(String type){//根据需要的类型生产对应的披萨 8 9 Pizze pz = null; 10 if(type.equals("cheese")){//芝士披萨 11 pz = new CheesePizze(); 12 }else if(type.equals("veggie")){//番茄披萨 13 pz = new VeggiePizze(); 14 } 15 else if(type.equals("sala")){//沙拉披萨 16 pz = new SalaPizze(); 17 } 18 19 return pz; 20 21 } 22 23 }
@4需要对象的客户端,披萨商店
1 package com.pattern.simplefactory; 2 3 /* 4 * 披萨商店,需要披萨对象来进行处理并销售 5 */ 6 public class PizzeStore { 7 8 9 10 public static void main(String[] args) { 11 12 Pizze pz; 13 pz = SimplePizzeFactory.createPizze("sala");//让披萨工厂生产一个沙拉披萨,不需要自己再去new出来 14 pz.prepare(); 15 pz.bake(); 16 pz.cut(); 17 pz.box(); 18 pz.sale(); 19 20 } 21 22 23 24 }
4.再看看运行结果
需要程序源码的可以加我微信x241602私聊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?