有一个水果加工工厂,我们的需求是实现加工水果的功能。常见的做法是创建一个水果抽象类,写一个抽象的加工方法,然后创建具体的水果类去继承抽象类,再去实现抽象方法,最后客户端再去新建对象实例。

public abstract class Fruit {abstract void make();
}
public class Apple extends Fruit{@Overridevoid make() {System.out.println("加工苹果");}
}
public class Pear extends Fruit {@Overridevoid make() {System.out.println("加工雪梨");}
}
public class Customer {public static void main(String[] args) {Apple a=new Apple();Pear p=new Pear();a.make();p.make();}
}

这种做法的缺点是将用户和水果紧密耦合了,用户需要知道创建水果对象的过程,如果创建对象的过程比较复杂,那么客户端每次需要创建对象时将写入大段的代码。因此,我们需要定义一个创建对象的类,由这个类专门生成这个对象的实例,这就引出了工厂模式

工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)

简单工厂模式
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象

对于上面的例子,我们不改动水果类的代码,只需要创建一个简单工厂类去产生水果的实例

public class SimpleFactory {public static Fruit create(String type){Fruit fruit=null;if(type=="apple")fruit=new Apple();if(type=="pear")fruit=new Pear();return fruit;}
}

客户端使用

public class Customer {public static void main(String[] args) {Apple a=(Apple)SimpleFactory.create("apple");Pear p= (Pear)SimpleFactory.create("pear");a.make();p.make();}
}

这样对象的创建就被简单工厂类封装起来了,用户不需要了解创建对象的过程,达到了解耦的目的。
但是简单工厂模式违反了开闭原则,即对扩展开放、对修改关闭。如果需要新增加水果种类,那么就必须要新增if语句。

适用场景
1、需要创建的对象较少
2、客户端不关心对象的创建过程

简单工厂类的角色分配
1、抽象产品角色
所有产品的父类,描述所有实例共有的方法
2、具体产品角色
简单工厂类的创建目标,具体实现了抽象产品的方法
3、工厂角色
负责实现创建所有实例的内部逻辑,工厂类可以被外部调用,创建所需的产品对象

2、工厂方法模式
工厂方法模式不再使用统一的工厂类去新建每一个对象,而是创建一个工厂抽象类,然后再针对每一个具体的产品类去创建一个具体的工厂类。

工厂类

public interface Factory {Fruit create(String type);
}
public class AppleFactory implements Factory {@Overridepublic Fruit create(String type) {Apple apple=new Apple();return apple;}
}
public class PearFactory implements Factory{@Overridepublic Fruit create(String type) {Pear p=new Pear();return p;}
}

客户端

public class Customer {public static void main(String[] args) {Factory factory=new AppleFactory();Factory factory1=new PearFactory();Apple a=(Apple)factory.create("apple");Pear p=(Pear)factory1.create("pear");a.make();p.make();}
}

这样的好处是当有新的水果种类时只需要新创建一个工厂类而不需要修改工厂类的代码。但是也带来了问题,每增加一个产品类就需要新创建一个工厂类,增加了开发的工作量。

适用场景
1、客户端不关心对象的创建过程,只需要了解创建对象的具体工厂子类

工厂类的角色分配
1、抽象产品角色
所有产品的父类,描述所有实例共有的方法
2、具体产品角色
具体实现了抽象产品的方法,每个产品类都对应一个工厂类
3、抽象工厂角色
定义了创建实例的接口,所有工厂类都要实现这个接口
4、具体工厂角色
实现抽象工厂接口的具体工厂类,包含创建某一种产品对象的逻辑。

抽象工厂模式
抽象工厂不仅仅可以生产一种产品,而是可以生产一组产品,这些产品是互相关联的。

现在有一个工厂需要生产水果和果汁,那么就需要抽象工厂。抽象工厂与普通工厂的区别是一个工厂对象可以创建一组相关的对象,而普通工厂是一个工厂对象只能创建一种对象。

产品类

public abstract class Fruit {abstract void make();
}public class Apple extends Fruit {@Overridevoid make() {System.out.println("加工苹果");}
}public abstract class Juice {public abstract void make();
}public class AppleJuice extends Juice {@Overridepublic void make() {System.out.println("制作苹果汁");}
}

工厂类

public interface Factory {Fruit createFruit();Juice createJuice();
}public class AppleFactory implements Factory {@Overridepublic Fruit createFruit() {Apple a=new Apple();return a;}@Overridepublic Juice createJuice() {AppleJuice j=new AppleJuice();return j;}
}

客户端

public class Customer {public static void main(String[] args) {Factory factory=new AppleFactory();Apple a=(Apple)factory.createFruit();AppleJuice appleJuice=(AppleJuice) factory.createJuice();a.make();appleJuice.make();}
}

适用场景
1、需要创建一组对象去实现功能。
2、系统结构稳定,不会频繁增加对象,如果一旦增加对象,那么就需要再抽象工厂类中修改代码,违反了开闭原则。

JAVA设计模式笔记(简单工厂模式)相关推荐

  1. Java设计模式之简单工厂模式实验(软件工程综合实践课程第二周)

    实验目的 1 .理解软件设计的相关理论 : 2 .理解面向对象设计原则: 实验内容 1 .简单工厂模式实验: (1) 参考讲义上的代码,利用简单工厂模式完成计算器应用程序: (2) 画出计算器程序简单 ...

  2. Java设计模式之 简单工厂模式和工厂方法实验报告书

    目录 Java设计模式之 1 简单工厂模式和工厂方法实验报告书 1 实验四:简单工厂模式和工厂方法 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1简单工厂模式:女娲 2 3.2简单工 ...

  3. Java设计模式之简单工厂模式(Simple Factory)

    [Java与模式]简单工厂模式(Simple Factory---吴义) 首先说明,Java与模式一系列的文章均是参考阎宏博士的<Java与模式>一书,加上自身的一些体会的探索,产生如下文 ...

  4. java设计模式之简单工厂模式

    定义: 由一个工厂对象决定创建出哪一种产品类的实例 类型:属于创建型,但不属于GOF23中设计模式 工厂模式分为三种: 1.简单工厂模式(静态工厂方法模式) 2.工厂方法模式(多态性工厂模式) 3.抽 ...

  5. java设计模式:简单工厂模式

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.简单工厂模式的角色和职责 1.工厂(C ...

  6. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

    简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1  场景问题 ...

  7. 设计模式之简单工厂模式(Java 实现)

    设计模式之简单工厂模式(Java 实现) 本文首发于http://www.imooc.com/wiki/Designlesson/factory.html 简单工厂模式是平时开发过程中最常见的设计模式 ...

  8. .NET设计模式(1): 简单工厂模式

    .NET设计模式(1): 简单工厂模式 最近一直在看设计模式,想把自己的学习笔记与大家分享一下,如果能帮助大家的话,我会非常高兴,同时也欢迎大家指出里面的不足.园子里其实关于此类文章已经很多了,如果d ...

  9. C#设计模式(2)——简单工厂模式

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂 ...

最新文章

  1. c语言怎么倒计时,如何在c语言程序中插入一个倒计时命令?
  2. 华为云力推“普惠AI”,EI智能体正在落地行业
  3. Remote Desktop Manager 2019中文版
  4. 【源码解析】ArrayList源码解析
  5. 悼念传奇,约翰询问#183;纳什和他的妻子艾丽西亚致敬,创建一个传奇,爱数学...
  6. Flink State 最佳实践
  7. 北大mooc课程平台
  8. 【算法导论第13章】红黑树
  9. 自动化测试工具selenium python_WEB自动化测试工具selenium录制器
  10. 视频教程-webpack基础和完整项目脚手架搭建教程-JavaScript
  11. 汉诺塔_-Chaz-_新浪博客
  12. iOS-QQ音乐播放器的简单实现
  13. 计算机本科生论文都抽查什么,本科生毕业论文抽查,抄袭马上会被撤销学位,学生最好别违规...
  14. 阿里云发现后门webshell文件 该如何解决处理
  15. 非法破坏计算机系统罪宣判,以非法经营罪提起公诉。法庭未当庭宣判。为什么不会被定破坏计算机信息系统罪呢?...
  16. 清华物理系与计算机系哪个好,兰州大学现在还有物理系吗?
  17. 【深入浅出Spring原理及实战】「开发实战系列」带你看看那些可能你还不知道的Spring特殊技巧和想不到的招数
  18. 方向导数、导数、梯度在图形学里的意义
  19. 把拒接电话作为已经接电话写到call log中
  20. 穷游第13国之韩国囧途之旅

热门文章

  1. 关于宽哥英语课,本人的遭遇
  2. 和平精英追猎模式怎么没了 和平精英追猎下架原因
  3. C++实现单例模式 —— 打印机
  4. 「项目实战」一文读懂思科网络设备IOS系统
  5. springboot项目配置视图解析器无效的问题
  6. 2018春招京东实习编程题解
  7. 得到app文稿导出_逻辑思维,阅读付费平台“得到APP”功能分析
  8. 大于23的男生女生都该看.看完你会变一个人【转】
  9. Docker容器安装Mysql8
  10. 开放API接口签名验证,让你的接口从此不再裸奔