JAVA中的设计模式二(工厂模式)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。
工厂模式主要有:
简单工厂模式,工厂方法,抽象工厂;
简单工厂:
又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:
如下面价单的图形

代码如下:
首先我们先创建一个抽象的产品:
package Factory;
public abstract class BMW {
public BMW() {
}
}
然后我们具体的产品类去继承我们的抽象产品:
public class BMW320 extends BMW{
public BMW320() {
// TODO Auto-generated constructor stub
System.out.println("生产BMW320");
}
}
public class BMW523 extends BMW{
public BMW523() {
// TODO Auto-generated constructor stub
System.out.println("生产BMW523");
}
}
下面我们创建我们的工厂:
package Factory;
public class Factory {
public BMW crateBMW(int type){
if(type==320){
return new BMW320();
}else if (type==523){
return new BMW523();
}else{
return null;
}
}
}
下面就是客户了,客户需要产品,我们进行生产:
package Factory;
public class Customer {
public static void main(String[] args) {
Factory f=new Factory();
BMW b320=f.crateBMW(320);
BMW b523=f.crateBMW(523);
}
}
运行的结果如下-----:

这个就是简单的工厂模式;
上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。
工厂方法:
工厂方法其实就是,不同额工厂对应不同的产品,就算其中某一个工厂不能正常工作了,也不会影响到其他的工厂工作;

首先我们先创建 产品接口和对应的具体产品
public interface Product {
}
public class Washer implements Product{
public Washer() {
System.out.println("洗衣机被制造了");
}
}
public class AirCondition implements Product{
public AirCondition() {
System.out.println("空调被制造了");
}
}
然后我们再创建 工厂接口和对应的具体生产不同商品的工厂
public interface Factory {
}
public class WasherFactory implements Factory{
public Product make(){
return new Washer();
}
}
public class AirConditionFactory implements Factory{
public Product make(){
return new AirCondition();
}
}
最后就是顾客了,
package Factory2;
public class Customer {
public static void main(String[] args) {
// TODO Auto-generated method stub
WasherFactory f=new WasherFactory();
Product w=f.make();
AirConditionFactory f2=new AirConditionFactory();
Product w2=f2.make();
}
}
运行的结果为:

可以理解为:有了很多个工厂方法,自己需要哪一个产品,就调用当前产品的工厂方法,获取相应的具体实例。
从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....
抽象方法:
抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。
我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,
我们继续用上面的例子来说明:
工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树

首先:我们创造不同的 电视和鼠标的接口:
public interface TV {
}
public interface Mouse {
}
然后我们创造冰箱和鼠标的不同的品种:
public class TV_A implements TV{
public TV_A() {
System.out.println("A型TV");
}
}
public class TV_B implements TV{
public TV_B() {
System.out.println("B型TV");
}
}
public class Mouse_A implements Mouse{
public Mouse_A() {
System.out.println("A型鼠标");
}
}
public class Mouse_B implements Mouse{
public Mouse_B() {
System.out.println("B型鼠标");
}
}
最后就等到了不同类型的工厂,生产不同类型的产品。如A工厂只生产A类型的产品
public class Factory_A implements Factory{
@Override
public TV createTv() {
// TODO Auto-generated method stub
return new TV_A();
}
@Override
public Mouse createMouse() {
// TODO Auto-generated method stub
return new Mouse_A();
}
}
public class Factory_B implements Factory{
@Override
public TV createTv() {
// TODO Auto-generated method stub
return new TV_B();
}
@Override
public Mouse createMouse() {
// TODO Auto-generated method stub
return new Mouse_B();
}
}
最后就是测试类:
package Foctory3;
public class Customer {
public static void main(String[] args) {
Factory f=new Factory_A();
f.createTv();
f.createMouse();
f=new Factory_B();
f.createTv();
f.createMouse();
}
}
运行结果如图所示:

JAVA中的设计模式二(工厂模式)的更多相关文章
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- Java设计模式02:常用设计模式之工厂模式(创建型模式)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java常见设计模式之工厂模式
工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple F ...
随机推荐
- 【Java疑难杂症】有return的情况下try catch finally的执行顺序
有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...
- _2Python_注释命名等基本操作
注释:注解,解释 主要用于在代码中给代码标识出相关的文字提示(提高代码的可读性)或调试程序,方便别人阅读和自己日后修改. Python中注释分为两类.单行注释:单行注释以#号开头,在一行内,#号后面的 ...
- RedHat升级Python到2.7.6
今天本来想研究一下Python paramiko模块,安装安装 paramiko-1.10.1.tar.gz的时候报错,!看了一下虚拟机RedHat中的python,发现还是原生的2.4.3,所以决 ...
- linux网络、性能相关命令
netstat -tunpl #查看进程列表 top #查看系统资源统计 服务器速度测试 ping 123.57.92.9 -t 每一个被发送出的IP信息包都有一个TTL域,该域被设置为一个较高的数值 ...
- scrapy初试水 day03(递归调用)
import scrapyfrom scrapy.http import Requestfrom scrapy.spider import Rulefrom scrapy.linkextractors ...
- Ztree改版 - 将图标字体化 - fontAwesome
引言 ps:小白可以一看,大神勿打~ 用过 ztree 的盆友们都知道,ztree 功能强大,就功能上来说,追求着“无处不按钮”的体验,但好用不好看.可能有朋友说:“我这棵树只有我自己看,够用就行” ...
- ##4.Glance 镜像服务-- openstack pike
##4.Glance 镜像服务 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Glance 镜像服务.txt ...
- JavaScript 性能优化技巧分享
JavaScript 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中.为了提高Web应用的性能,从 JavaScript 的性能优化方向入手,会是一个很好的选择. 本文从加载.上 ...
- php XSS安全过滤代码
function remove_xss($val) { // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are ...
- 使用REST风格架构您需要知道的一些事
1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...