工厂设计模式

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

简单工厂模式-Spring-beanfactory

  • 简单工厂模式:专门定义一个类用来创建其他类的实例,被创建的实例通常拥有共同的父类。
  • 组成:
  1. 一个抽象产品类
  2. 具体产品类
  3. 一个工厂
  • 代码:
import java.util.Scanner;
interface Computer{void printComputer();
}
class MacbookComputer implements Computer{
@Override
public void printComputer() {System.out.println("This is a mac");}
}
class SurfacebookComputer implements >Computer{@Overridepublic void printComputer() {System.out.println("This is a surface");}
}
class ComputerFactory{public static Computer getInstance(String type){Computer computer = null;if (type.equals("macbook")){computer = new MacbookComputer();} else if (type.equals("surface")){computer = new SurfacebookComputer();}return computer;}
}
public class Client {public static void main(String[] args) {Client client = new Client();Scanner scanner = new Scanner(System.in);System.out.println("请输入电脑型号");String type = scanner.nextLine();Computer computer = ComputerFactory.getInstance(type);client.buyComputer(computer);}public void buyComputer(Computer computer){computer.printComputer();}
}
  • 优点:
  1. 简单易于实现
  2. 把类的实例化交给工厂,易于解耦
  • 缺点:
  1. 添加具体产品需要修改工厂违反OCP开放封闭原则

工厂方法模式-产品族

  • 工厂方法模式:定义一个用来创建对象的接口,让子类决定实例化哪个工厂
  • 组成:
  1. 一个抽象产品类
  2. 多个具体产品类
  3. 一个抽象工厂
  4. 多个具体工厂(每个产品对应一个具体工厂)
  • 代码:
interface Computer{void printComputer();
}
class MacbookComputer implements Computer{@Overridepublic void printComputer() {System.out.println("This is a mac");}
}
class SurfacebookComputer implements Computer{@Overridepublic void printComputer() {System.out.println("This is a surface");}
}
interface ComputerFactory{Computer createComputer();
}
class AppleFactory implements ComputerFactory{@Overridepublic Computer createComputer() {return new MacbookComputer();}
}
class MsFactory implements ComputerFactory{@Overridepublic Computer createComputer() {return new SurfacebookComputer();}
}
public class Client {public static void main(String[] args) {Client client = new Client();ComputerFactory factory = new AppleFactory();client.buyComputer(factory.createComputer());}public void buyComputer(Computer computer){computer.printComputer();}
}
  • 优点:
  1. 降低了代码的耦合度,对象的生成交给子类去完成
  2. 实现了开放封闭原则,每次添加子产品,不需要修改原代码
  • 缺点:
  1. 增加了代码量,每一个具体产品都需要一个具体工厂
  2. 当增加抽象产品也就是添加一个其他产品族,需要修改工厂,违背了OPC

抽象工厂模式

  • 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • 组成:
  1. 多个抽象产品类
  2. 具体产品类
  3. 抽象工厂类-声明(一组)返回抽象产品的方法
  4. 具体工厂类-生产(一组)具体产品
  • 代码:
interface Computer{void printComputer();
}
class MacbookComputer implements Computer{@Overridepublic void printComputer() {System.out.println("This is a mac");}
}
class SurfacebookComputer implements Computer{@Overridepublic void printComputer() {System.out.println("This is a surface");}
}
interface OperatingSystem{void printSystem();
}
class MacOsSystem implements OperatingSystem{@Overridepublic void printSystem() {System.out.println("This is a mac os");}
}
class WindowsSystem implements OperatingSystem{@Overridepublic void printSystem() {System.out.println("This is a window 8");}
}
interface ProductionFactory{Computer createComputer();OperatingSystem createSystem();
}
class AppleFactory implements ProductionFactory{@Overridepublic Computer createComputer() {return new MacbookComputer();}@Overridepublic OperatingSystem createSystem() {return new MacOsSystem();}
}
class MsFactory implements ProductionFactory{@Overridepublic Computer createComputer() {return new SurfacebookComputer();}@Overridepublic OperatingSystem createSystem() {return new WindowsSystem();}
}
public class Client {public static void main(String[] args) {Client client = new Client();ProductionFactory factory = new AppleFactory();Computer computer = factory.createComputer();OperatingSystem system = factory.createSystem();client.buyComputer(computer);client.use(system);}public void buyComputer(Computer computer){computer.printComputer();}public void use(OperatingSystem s){s.printSystem();}
}
  • 优点:
  1. 代码解耦
  2. 实现多个产品族(相关联产品组成的家族),而工厂方法模式的单个产品,可以满足更多的生成需求
  3. 很好的满足OPC开放封闭原则
  4. 抽象工厂模式中我们可以实现不止一个接口,一个工厂也可以生成不止一个产品类,对于复杂对象的生产相当灵活易扩展
  • 缺点:
  1. 扩展产品族相当麻烦,而且扩展产品族会违反OPC,因为要修改所有的工厂
  2. 由于抽象工厂模式是工厂方法模式的扩展,总体来说很笨重
  • 总结:
  • 简单工厂模式最大的优点就是工厂内有具体的逻辑去判断生成什么产品,将类的实例化交给了工厂,这样当我们需要什么产品只需要修改工厂的调用而不需要去修改客户端,对于客户端来说降低了与具体产品的依赖
  • 工厂方法模式是简单工厂的扩展,工厂方法模式把原先简单工厂中的实现那个类的逻辑判断交给了客户端,如果像添加功能只需要修改客户和添加具体的功能,不用去修改之前的类。
  • 抽象工厂模式进一步扩展了工厂方法模式,它把原先的工厂方法模式中只能有一个抽象产品不能添加产品族的缺点克服了,抽象工厂模式不仅仅遵循了OCP原则,而且可以添加更多产品(抽象产品),具体工厂也不仅仅可以生成单一产品,而是生成一组产品,抽象工厂也是声明一组产品,对应扩展更加灵活,但是要是扩展族系就会很笨重

反射与简单工厂模式

  • 对比:传统简单工厂模式,每次添加一个接口的子类都需要修改工厂类(即需要new新的子类对象)。而通过反射的方式可以使用newInstance()实例化对象,同时Class.forName()可以接收类名称。
  • 代码
interface IFurit{void eat();
}class Apple implements IFurit{@Overridepublic void eat() {System.out.println("eat apple");}
}class Orange implements IFurit{@Overridepublic void eat() {System.out.println("eat orange");}
}class FuritFactory{private FuritFactory(){}public static IFurit getInstance(String name){IFurit furit = null;try {furit = (IFurit) Class.forName(name).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return furit;}
}public class testFactory {public static void main(String[] args) {IFurit furit = FuritFactory.getInstance("Orange");furit.eat();}
}

Java之工厂设计模式相关推荐

  1. java抽象工厂设计模式_23种经典设计模式的java实现_1_抽象工厂模式

    抽象工厂模式的适用: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想 ...

  2. java简单工厂设计模式

    1.概念: 就是建立一个工厂类,对实现了某一个接口的的一些类进行实例的创建,其实质是根据传入的参数,动态判断应该创建 哪一个产品类的实例. 2,代码举例: 写一个娃娃的接口,有两个产品类,一个是布娃娃 ...

  3. Java设计模式(四):工厂设计模式

    1. 工厂设计模式 1.1 应用场景 由于需求的变化,一个类的子类经常面临着剧烈的变化,但他却拥有比较稳定的接口.使用一种封装机制来"隔离这种易变对象的变化",工厂方法定义一个用于 ...

  4. 简单工厂和 工厂设计模式--抽象工厂模式--Java实现

    简单工厂不是23种设计模式 工厂方法·模式 :定义一个创建对象得接口,但是让实现这个接口的类来决定实例化哪一个类,工厂方法能使得类的实例化推迟到子类中进行 工厂方法缺点: 增加了类的数量,增加复杂度 ...

  5. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  6. java工厂模式和抽象工厂_Java中的抽象工厂设计模式

    java工厂模式和抽象工厂 Welcome to Abstract Factory Design Pattern in java example. Abstract Factory design pa ...

  7. Java 工厂设计模式

    简介 工厂设计模式在java中有大量的应用,如spring框架,这种类型的设计模式属于创建型模式.在工厂设计模式中,创建逻辑不会对客户端暴露,可以通过一个对外接口创建所需对象. 工厂模式使用场景 需要 ...

  8. Java工厂设计模式

    工厂设计模式 一.面向对象的设计原则 1.1 OCP(开闭原则,Open-Closed Principle) 1.2 DIP(依赖倒转原则,Dependence Inversion Principle ...

  9. Java设计模式——工厂设计模式

    工厂设计模式 一.简介 都不知道简介要写什么,工厂模式嘛,就是工厂嘛,生产东西的嘛-- 在Java里面就是用来帮助我们生产对象的咯-- 主要作用嘛,大概就是将创建和使用对象拆分减低耦合度吧. 二.分类 ...

最新文章

  1. Python3中对Dict的内存优化
  2. Mat,Iplimage,vector,vector_vector_Point2f等类型之间的相互转换
  3. linux suse 软件管理工具 zypper 简介
  4. iOS-QQ临时对话、QQ群申请跳转
  5. nginx_反向代理
  6. LeetCode 32. Longest Valid Parentheses
  7. 基于PCDN技术的无延时直播方案
  8. 面试官:this和super有什么区别?this能调用到父类吗?
  9. All Friends 极大团
  10. 让谷歌、百度最快最多地收录您的网站
  11. 语音识别是如何识别出各地方言的?
  12. matlab 空间解析几何,Matlab 数学软件包在向量代数—空间解析几何中的应用
  13. 英文密码特殊字符大全
  14. 遇见心想事成的自己……
  15. Implicit Neural Representations with Periodic Activation Functions
  16. pygame精灵组有哪些方法_pygame 的精灵使用
  17. 三菱GX Developer+GX Simulator进行仿真调试
  18. 这世上本来没有路,走的人多了,也便成了路
  19. 阿里云OSS上传下载跨域问题
  20. python爬虫之网易云歌曲下载(需要js分析) -- 2020.06.20更新

热门文章

  1. 2012,独立B2C已死!天猫战后观格局
  2. 大整数加法——求两个不超过200位的非负整数的和
  3. FastReport .NET2022.2x,完整的源代码可用
  4. powerdesigner
  5. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
  6. 减治法在组合问题中的应用 ——8枚硬币问题
  7. 一文读懂WiFi网络摄像机参数设置的含义
  8. Mysql第一阶段结束语
  9. 深职院入职培训心得2021
  10. 经典基础算法的一些精髓和注意点总结