工厂模式:

工厂模式可以分为三类:

1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)

简单工厂模式

插头 分为二孔插头和三孔插头。
首先 创建插头产品类 Pin

public class Pin {protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTw() {System.out.println("I am 2孔 Pin");}
}/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTh() {System.out.println("I am 3孔 Pin");}
}

然后创建插头工厂类

/**
* @author hjn
*插头工厂类
*/
public class PinFactory {/*** @param type* @return* 根据插头数返回相对的插头对象*/public static Pin creatPin(int type) {switch (type) {case 2:return new PinTw();case 3:return new PinTh();default:break;}return null;}
}

最后 测试类 :

public class TestPin {public static void main(String[] args) {Pin pinth = PinFactory.creatPin(3);Pin pintw = PinFactory.creatPin(2);}
}        

这就是简单工厂模式。

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
先来看看它的组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。

下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的插头型号的时候,想要一种更多头的新型插头,只要这种插头符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型插头,都要在工厂类中增加相应的创建业务逻辑(creatPin(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。
我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员。
于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的插头种类型,就增加该插头种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。

简单工厂模式的优缺点
 优点:客户端不需要修改代码。
 缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
工厂方法模式组成:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!

首先 创建插头产品类 Pin

public class Pin {protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTw() {System.out.println("I am 2孔 Pin");}
}/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTh() {System.out.println("I am 3孔 Pin");}
}

然后创建插头工厂接口:

/**
* @author hjn
* 工厂方法接口*
*/
public interface IPinFactory {public Pin creatPin();}

然后创建 二孔插头和三孔插头的工厂

/**
* @author hjn
*二孔的工厂类
*/
public class PinTwFactory implements IPinFactory {Pin ptw=new PinTw();public Pin creatPin() {    return ptw;}
}/**
* @author hjn
*三孔的工厂类
*/
public class PinThFactory implements IPinFactory {Pin pth=new PinTh();public Pin creatPin() {    return pth;}
}

测试类 :

public class TestPin {public static void main(String[] args) {PinThFactory pthf =new PinThFactory();Pin pinth = pthf.creatPin();PinTwFactory ptwf=new PinTwFactory();Pin pintw = ptwf.creatPin();}
}

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂,当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。

  好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
  缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

抽象工厂模式

首先 创建插头产品类 Pin

public class Pin {protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTw() {System.out.println("I am 2孔 Pin");}
}

/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTh() {System.out.println("I am 3孔 Pin");}
}

然后创建插头工厂接口:

/**
* @author hjn
* 工厂方法接口*
*/
public interface IPinFactory {public Pin creatPinTw();public Pin creatPinTh();
} /**
* @author hjn
*Pin工厂实现类
*/
public class PinFactoryImpl implements IPinFactory {@Overridepublic Pin creatPinTw() {return new PinTw();}@Overridepublic Pin creatPinTh() {    return new PinTh();}}

测试类

public class TestPin {public static void main(String[] args) {PinFactoryImpl pin = new PinFactoryImpl();Pin ptw = pin.creatPinTw();Pin pth = pin.creatPinTh();}
}

 抽象工厂模式,一个具体工厂可以制造几个产品

优点:易于交换产品系列,例如Access和SQLServer数据库之间切换。
  缺点:如果需要增加新的产品树,那么就要新增三个产品类,并且要修改三个工厂类。这样大批量的改动是很丑陋的做法。

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。

区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

转载于:https://www.cnblogs.com/caixiaohua/p/6760389.html

Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式相关推荐

  1. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  2. Java工厂模式(简单工厂、工厂方法、抽象工厂)详解

    工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式.在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象. 1.工厂模式的理解 1.1.工厂模式的分类 工厂模 ...

  3. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

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

    简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决 ...

  5. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  6. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

  7. 工厂模式之简单工厂、工厂方法、抽象工厂分析对比

    工厂模式有三种分类,简单工厂(也叫静态工厂).工厂方法模式.抽象工厂 一.简单工厂 简单工厂通俗的说就是提供一个类,这个类中的某个方法根据入参的不同来创建并返回实现了同一个接口的不同具体子类(产品). ...

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

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

  9. 设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  10. Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

    文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...

最新文章

  1. 字符设备编号的注册分配
  2. boost::endian::endian_load的测试程序
  3. 【ACM】nyoj_139_我排第几个_201308062046
  4. Mycat适合场景及不适合场景
  5. 一个canvas的demo
  6. SQL Server 2012 自动增长列,值跳跃问题
  7. 批量word转pdf——VBS脚本,在office宏中运行即可
  8. 探索者易打软件--实现AutoCAD批量打印和自动命名
  9. 堆栈平衡:估计这是最详细的讲解堆栈平衡的了
  10. jmeter学习:如何使用jmeter自动发帖
  11. 光辉岁月-Beyond
  12. 怎么使用7zip进行分批压缩_7z解压软件(7-zip)分卷压缩怎么做?
  13. YML是一种数据存储格式
  14. 电视机与计算机共享,终于实现电视与电脑共享了!与大家分享!
  15. 永磁直驱风力发电机并网仿真,机侧采用最大功率跟踪控制
  16. java计算机毕业设计高校科研项目管理系统MyBatis+系统+LW文档+源码+调试部署
  17. C/C++学习:慎用static变量
  18. C#图像处理程序实现--Canny实现 笔记整理(其中的非极大值抑制点)
  19. 九浅一深(深浅拷贝)
  20. Tessent Ijtag 第二章节 什么是ICL文件

热门文章

  1. java清理语句,java – 如何在不使用准备语句的情况下对SQL进行清理
  2. 万兆以太网测试仪应该具备的测试功能
  3. 设备的分配与调度简单方案_连铸生产调度与动态重调度的优化与研究-3,炼钢技术(3)原创...
  4. 幽默:程序员10大口头禅,你都听过吗?
  5. 不懂这11个隐藏技巧,别说你会用微信
  6. 收集19个前端开发人员的必备工具
  7. MVC5 Controller构造方法获取User为空解决方法
  8. python datetime用法_python datetime用法学习笔记
  9. IntelliJ IDEA 刷题利器 LeetCode 插件
  10. 网易前端进阶特训营,邀你免费入营!一举解决面试晋升难题!