工厂模式(简单工厂 工厂方法 抽象工厂)

news/2024/11/24 8:02:36/

简单工厂模式

        简单工厂模式又叫做静态工厂方法模式(static Factory Method pattern),它是通过使用静态方法接收不同的参数来返回不同的实例对象(这些产品类继承自一个父类或接口)。

       简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式

工厂(Creator)角色

简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

抽象产品(Product)角色

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色

是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

 代码展示

interface IKeyboard{void inPrint();void outPrint();
}
class DelKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用功戴尔的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用功戴尔的键盘输出");}
}
class HPKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用惠普的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用惠普的键盘输出");}
}
class LenovoKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用联想的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用联想的键盘输出");}
}
class IKeyboardFactory{public static IKeyboard createKeyboard(String brand){IKeyboard keyboard = null;switch (brand){case "HP":keyboard = new HPKeyboard();break;case "Lenovo":keyboard = new LenovoKeyboard();break;case "Del":keyboard = new DelKeyboard();break;}return keyboard;}
}
public class SimpleFactory {public static void main(String[] args) {IKeyboard hp = IKeyboardFactory.createKeyboard("HP");hp.inPrint();//使用惠普的键盘输入hp.outPrint();//使用惠普的键盘输出}
}

 工厂方法模式

工厂模式是简单工厂模式的升级版,满足了开闭原则(对扩展开放,对修改关闭),解决了简单工厂模式的灵活性差的缺点。工厂模式将创建对象的工作交给了工厂的子类(延迟创建对象)。这样,在需要新增的时候就可以不破坏原来的结构

 代码展示

interface IKeyboard{void inPrint();void outPrint();
}
class DelKeyboard implements IKeyboard {@Overridepublic void inPrint() {System.out.println("使用功戴尔的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用功戴尔的键盘输出");}
}
class HPKeyboard implements IKeyboard {@Overridepublic void inPrint() {System.out.println("使用惠普的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用惠普的键盘输出");}
}
class LenovoKeyboard implements IKeyboard {@Overridepublic void inPrint() {System.out.println("使用联想的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用联想的键盘输出");}
}
interface IKeyboardFactory{IKeyboard createKeyboard();
}
class DelKeyboardFactory implements IKeyboardFactory{@Overridepublic IKeyboard createKeyboard() {return new DelKeyboard();}
}
class HPKeyboardFactory implements IKeyboardFactory{@Overridepublic IKeyboard createKeyboard() {return new HPKeyboard();}
}
class LenovoKeyboardFactory implements IKeyboardFactory{@Overridepublic IKeyboard createKeyboard() {return new LenovoKeyboard();}
}
public class FactoryMethod {public static void main(String[] args) {IKeyboardFactory LenovoKeyboardFactory = new LenovoKeyboardFactory();//获得联想键盘工厂IKeyboard lenovokeyboard = LenovoKeyboardFactory.createKeyboard();//使用联想键盘工厂造具体键盘lenovokeyboard.inPrint();//使用联想的键盘输入lenovokeyboard.outPrint();//使用联想的键盘输出}
}

优缺点:其中最主要的是 IFactory类中的createKeyboard方法,通过这个方法来生成具体产品,这也是为什么叫工厂方法的原因。和简单工厂的静态方法不同,这里是使用的非静态调用方式。而且可以发现,没有了简单工厂中的 if-else逻辑判断,相对而言扩展性也要强的多。

优点:完全实现开闭原则,实现了可扩展和更复杂的层次结构。明确了职责,具有多态性,适用于任何实体类。

缺点:如果业务增加,会使得系统中类的个数成倍增加,提高了代码的复杂度

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)属于创建型模式,它实际上是对工厂方法模式的扩展,相当于一个超级工厂,用于创建其他工厂的模式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,而且每个工厂都能按照工厂模式提供对象。其实抽象工厂也是为了减少工厂方法中的子类和工厂类数量,基于此提出的设计模式。

子类提供的方案是一个产品簇cu,是互相匹配的产品。

抽象工厂的本质是:选择产品簇的实现

 代码展示

 

interface IKeyboard{void inPrint();void outPrint();
}
interface IMouse{void click();
}
interface IMonitor{void show();
}
class DelKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用功戴尔的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用功戴尔的键盘输出");}
}
class DelMonitor implements IMonitor{@Overridepublic void show() {System.out.println("使用戴尔的显示屏观看");}
}
class DelMouse implements IMouse{@Overridepublic void click() {System.out.println("使用戴尔的鼠标点击");}
}
class HPKeyboard implements IKeyboard{@Overridepublic void inPrint() {System.out.println("使用惠普的键盘输入");}@Overridepublic void outPrint() {System.out.println("使用惠普的键盘输出");}
}
class HPMonitor implements IMonitor{@Overridepublic void show() {System.out.println("使用戴尔的显示屏观看");}
}
class HPMouse implements IMouse{@Overridepublic void click() {System.out.println("使用惠普的鼠标点击");}
}
interface IFactory{IMouse createMouse();IMonitor createMonitor();IKeyboard createKeyboard();
}
//创建具体的戴尔工厂用于生产各种戴尔的产品
class DelFactory implements IFactory{@Overridepublic IMouse createMouse() {return new DelMouse();}@Overridepublic IMonitor createMonitor() {return new DelMonitor();}@Overridepublic IKeyboard createKeyboard() {return new DelKeyboard();}
}
//创建具体的惠普工厂用于生产各种惠普的产品 根据需要是否把工厂设置为单例模式
class HPFactory implements IFactory{@Overridepublic IMouse createMouse() {return new HPMouse();}@Overridepublic IMonitor createMonitor() {return new HPMonitor();}@Overridepublic IKeyboard createKeyboard() {return new HPKeyboard();}
}
//相当于客户端
public class AbstractFactory {public static void main(String[] args) {IFactory iFactory = new HPFactory();//获取惠普工厂//使用惠普的工厂创建具体的产品IKeyboard keyboard = iFactory.createKeyboard();IMonitor monitor = iFactory.createMonitor();IMouse mouse = iFactory.createMouse();keyboard.inPrint();monitor.show();mouse.click();}
}

优缺点:

优点:增加分组比较容易,而且能大大减少工厂类的数量

缺点:因为分组,所以分组中的产品扩展就比较困难,比如再新增一个IMouse鼠标,就需要改动IFactory、DellFactory和HPFactory几乎所有工厂类

             没有最好的设计模式,只有最适合的设计模式


http://www.ppmy.cn/news/37905.html

相关文章

VR全景餐厅, 全景VR新颖的沉浸式就餐体验

随着科技的不断发展,餐饮业也在寻求各种创新以满足顾客日益增长的需求。VR全景餐厅应运而生,它结合了虚拟现实技术与美食,为顾客提供了一种前所未有的沉浸式就餐体验。本文将深入探讨VR全景餐厅的核心技术、特色菜品和服务,以及它…

JavaScript之DOM操作

目录一、对元素进行操作1.动态生成元素2.在尾部插入一个元素3.在指定位置插入元素4.替换指定元素5.删除子级元素6.删除自身元素7.innerHTML二、对属性进行操作1.属性的设置(setAttribute)2.属性的获取(getAttribute)3.属性的删除&…

nginx--开源免费

nginx开源免费,支持高性能,高并发的web服务和代理服务软件。 apache,nodejs nginx可以提供的服务: 1、web服务 2、负载均衡(反向代理)(动静分离) 3、web cache(web缓存) nginx…

android studio安装automotive模拟器

添加源 打开android studio的SDK Manager选择SDK Update Sites选项卡点击Add,弹出地址设置界面 添加polestar2-sys-img Name填写:Polestar 2 System Image (可自定义)URL填写:https://developer.polestar.com/sdk/polestar2-sys-img.xml其他保持默认 添…

算法---扫雷游戏

题目 让我们一起来玩扫雷游戏! 给你一个大小为 m x n 二维字符矩阵 board ,表示扫雷游戏的盘面,其中: ‘M’ 代表一个 未挖出的 地雷, ‘E’ 代表一个 未挖出的 空方块, ‘B’ 代表没有相邻(…

Servlet基础

快速入门 创建maven web项目&#xff0c;导入Servlet依赖坐标&#xff1a; <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>…

企业申请的ISO认证证书,证书状态如何辨别?

企业申请的ISO认证证书&#xff0c;证书状态如何辨别&#xff1f; 关于ISO证书的有效期及ISO证书年度监督审核规定&#xff1a; ISO证书的有效期&#xff1a;ISO认证证书的有效期为三年&#xff0c;每年进行年度监督审核。每次的年度监督审核时间间隔不能超过12个月&#xff0…

C++ Primer第五版_第九章习题答案(11~20)

文章目录练习9.11练习9.12练习9.13练习9.14练习9.15练习9.16练习9.17练习9.18练习9.19练习9.20练习9.11 对6种创建和初始化 vector 对象的方法&#xff0c;每一种都给出一个实例。解释每个vector包含什么值。 vector<int> vec; // 0 vector<int> vec(10); //…