文章部分摘自网络

引言:

 工厂设计模式分为三种:

  1. 简单工厂

  2. 工厂方法

  3. 抽象工厂

 联想四种情况

  (1)、还没有工厂时代:假如还没有工业革命,如果一个客户要一件产品,一般的做法是客户去创建一件产品,然后拿来用。

  (2)、简单工厂模式:后来出现工业革命。用户不用去创建产品。因为客户有一个工厂来帮他创建产品.想要什么产品,这个工厂就可以创建这种产品。比如想要一台洗衣机。工厂就创建这台洗衣机。即工厂可以创建产品。

  (3)、工厂方法模式时代:为了满足客户,要求的产品越来越多,如洗衣机、电视机等系列,一个工厂无法创建所有的产品。于是由单独分出来多个具体的工厂。每个具体工厂创建一种产品。即具体工厂类只能创建一个具体产品。但是工厂还是个抽象。你需要指定某个具体的工厂才能生产产品出来。

  (4)、抽象工厂模式时代:随着客户的要求越来越高,由于不同工厂的产品品质和功能不一样,客户希望生产好的电视机的厂商可以生产洗衣机。于是这个工厂开始生产电视机车和需要的洗衣机。

假设有三种产品:洗衣机、电视机和空调。

一、简单工厂模式(Simple Factory)

建立一个工厂(一个函数或一个类方法)来制造新的对象。
分布说明引子:从无到有。客户自己创建宝马车,然后拿来用。但是客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了。为了降低耦合,就出现了工厂类,把创建产品的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的产品的类型就行了,而不必去知道创建的细节.这就是工业革命了:简单工厂模式

  首先创建一个共同的产品接口

package com.gqx.Factory;
public interface Product {}

  然后将洗衣机、电视机和空调去实现该接口

package com.gqx.SimpleFactory;
public class TV implements Product {
public TV(){
System.out.println("电视机被生产了!");
}
} package com.gqx.SimpleFactory;
public class Wash implements Product {
public Wash(){
System.out.println("洗衣机被生产了!");
}
} package com.gqx.SimpleFactory;
public class Aircondition implements Product {
public Aircondition(){
System.out.println("空调被生产了");
}
}

  产品被实现后,我们需要创建一个工厂,直接让用户在工厂中取走产品,而不是让用户来创建,从而降低用户和产品的耦合度。

package com.gqx.SimpleFactory;
public class SimpleFactory {
public static Product getProduct(String name){
if (name.equals("wash")) {
return new Wash();
}else if (name.equals("TV")) {
return new TV();
}else if (name.equals("Aircondition")) {
return new Aircondition();
}else {
return null;
}
}
}

  客户端

package com.gqx.SimpleFactory;

public class Client {

	public static void main(String[] args) {
// TODO Auto-generated method stub
Product product =SimpleFactory.getProduct("wash");
Product product2 =SimpleFactory.getProduct("TV");
Product product3=SimpleFactory.getProduct("Aircondition");
}
}

   简单工厂模式的核心就是SimpleFactory类,他拥有常见产品的权限,我们只需要把订单给它,他就可以生产出相应的产品。但这样也有很多局限,每当我们增加一个产品的时候,都必须修改其源代码,其次,我们有很多产品的时候,里面的if和else关系太过复杂和冗长。

二、工厂方式(Factory Method)

   工厂方法模式使用实现抽象工厂角色的多个接口来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!

首先创建产品接口

package com.gqx.Factory;
public interface Product {
}

创建相对应的产品

package com.gqx.Factory;
public class TV implements Product {
public TV(){
System.out.println("电视机被生产了!");
}
} package com.gqx.Factory;
public class Wash implements Product {
public Wash(){
System.out.println("洗衣机被生产了!");
}
} package com.gqx.Factory;
public class Aircondition implements Product {
public Aircondition(){
System.out.println("空调被生产了");
}
}

创建工厂接口、分担简单工厂中‘上帝’的责任

package com.gqx.Factory;

public interface Factory {

}

创建相对应的工厂

package com.gqx.Factory;
public class WashFactory implements Factory {
public Product create(){
return new Wash();
}
} package com.gqx.Factory;
public class TVFactory implements Factory {
public Product createTV(){
return new TV();
}
} package com.gqx.Factory;
public class AirconditionFactory implements Factory {
public Product createAircondition(){
return new Aircondition();
}
}

客户通过指定的工厂拿到指定的产品

package com.gqx.Factory;

public class Client {

    public static void main(String[] args) {
// TODO Auto-generated method stub
TVFactory tvFactory=new TVFactory();
tvFactory.createTV(); AirconditionFactory airconditionFactory=new AirconditionFactory();
airconditionFactory.createAircondition(); WashFactory washFactory=new WashFactory();
washFactory.create();
} }

  工厂方法虽然解决了上面的问题,但是产品对象增多的时候,会出现大量与之对应的工厂类,这就让我们更加不易理清其中的逻辑了。

三、抽象工厂(Factory Method)

  随着客户的要求越来越高,由于不同工厂的产品品质和功能不一样,客户希望生产好的电视机的厂商可以生产洗衣机。于是这个工厂开始生产电视机车和需要的洗衣机。

首先,我们就需要先创建洗衣机和电视机的接口

package com.gqx.AbstractFactory;
public interface Wash {
} package com.gqx.AbstractFactory;
public interface TV {
}

然后两个不同的厂商分别实现其接口

package com.gqx.AbstractFactory;
//厂商一
public class TV1 implements TV {
public TV1 (){
System.out.println("TV1被生产了。哈哈");
}
}
package com.gqx.AbstractFactory;
//厂商一
public class Wash1 implements Wash {
public Wash1(){
System.out.println("Wash1被生产了!");
}
} package com.gqx.AbstractFactory;
//厂商二
public class TV2 implements TV {
public TV2(){
System.out.println("TV2被生产了,哈哈哈");
}
}
package com.gqx.AbstractFactory;
//厂商二
public class Wash2 implements Wash {
public Wash2(){
System.out.println("wash2被生产了,哈哈哈");
}
}

现在开始创建工厂接口

package com.gqx.AbstractFactory;

public interface Factory {
public Wash createWash();
public TV createTv();
}

让两家工厂去实现该接口

package com.gqx.AbstractFactory;
public class Factory1 implements Factory {
@Override
public Wash createWash() {
// TODO Auto-generated method stub
return new Wash1();
} @Override
public TV createTv() {
// TODO Auto-generated method stub
return new TV1();
}
} package com.gqx.AbstractFactory;
public class Factory2 implements Factory {
@Override
public Wash createWash() {
// TODO Auto-generated method stub
return new Wash2();
} @Override
public TV createTv() {
// TODO Auto-generated method stub
return new TV2();
}
}

最后,则是客户端

package com.gqx.AbstractFactory;

public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factory1 factory1=new Factory1();
factory1.createTv(); Factory1 factory11=new Factory1();
factory11.createWash();
}
}
  抽象工厂模式的起源或者最早的应用,是用于创建分属于不同操作系统的视窗构建。比如:命令按键(Button)与文字框(Text)都是视窗构建,在UNIX操作系统的视窗环境和Windows操作系统的视窗环境中,这两个构建有不同的本地实现,它们的细节有所不同。
在每一个操作系统中,都有一个视窗构建组成的构建家族。在这里就是Button和Text组成的产品族。而每一个视窗构件都构成自己的等级结构,由一个抽象角色给出抽象的功能描述,而由具体子类给出不同操作系统下的具体实现。

Java-工厂设计模式的更多相关文章

  1. Java工厂设计模式

    程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类 //=============================================== ...

  2. java工厂设计模式初步

    没有利用反射机制定义的简单工厂类 interface Fruit{ public void eat(); } class Apple implements Fruit{ public void eat ...

  3. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  4. 利用Java反射机制优化简单工厂设计模式

    之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...

  5. java简单工厂设计模式

    一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...

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

    工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person();  //耦合性强              Man p = new Per ...

  7. Java反射机制(五):使用反射增强简单工厂设计模式

    关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍:  我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...

  8. 工厂设计模式灵魂拷问-Java实现

    show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 我们经常听到工厂模式 ...

  9. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  10. 单例模式——Java EE设计模式解析与应用

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

随机推荐

  1. b+树 b-树的区别

    B+树与B*树小结 一.B+树 1.B+树定义与特性 B+树是B-树的变体,也是一种多路搜索树: 其定义基本与B-树同,除了: 1).非叶子结点的子树指针与关键字个数相同: 2).非叶子结点的子树指针 ...

  2. ASP.NET MVC轻教程 Step By Step 1 ——入门

    使用ASP.NET MVC有一段时间了,本人还是非常喜欢ASP.NET MVC这个框架模式的.在经历了WebForm复杂粗暴的做法后,自然感觉简洁优雅的MVC清新可人,只不过WebForm和MVC的设 ...

  3. 加密算法 - RSA算法二

    RSA算法原理(二)  声明: 本文转自阮一峰 (http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html) 有了这些知识, ...

  4. 关于Java(介绍)

    基于Java官方指导文档,开展学习 Java是什么 Java 是编程语言,也是一个平台 特性 简单 可移植 面向对象 分布式运算高性能 健壮 安全 动态 体系结构中立 记忆宫殿:恋爱是件简单的事,但放 ...

  5. CKplayer 新手入门超简单使用教程

    网页播放器都有使用的前提(问1). ~~~~~~~分隔线~~~~~~~ 只需一步先看播放器效果(问2): 下载附件,解压内容(ckplayer文件夹和ckplayer.html)到网站根目录,在浏览器 ...

  6. DJANGO:根据不同的环境,配置不同的SETTINGS文件,读取不同的DB,JENKINS,SALT配置

    今天撸了一次,实现如下: 1,新建配置目录,将不同的环境的SETTINGS.PY文件独立出来,并将各自环境引用的DB连接,JENKINS,SALT等参数都写在里面. DEMO: JENKINS = { ...

  7. Nginx配置性能优化(转)

    大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了.而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能 ...

  8. oracle的sqlnet.ora , tnsnames.ora , Listener.ora 文件的作用(转)

    oracle网络配置三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下.1. sqlnet.o ...

  9. 协助ScriptCase7.1做些汉化矫正工作

    之前帮助Script.net做了一部分网站的汉化工作,不过我对ScriptCase自己做的网站不满意,对其汉化网站更是不满意. ScriptCase7出来之后,比较让人头疼的就是汉化的问题,较之v6, ...

  10. 【HDOJ】1166 敌兵布阵

    线段树. #include <stdio.h> #define maxn 55555 ]; void PushUP(int rt) { sums[rt] = sums[rt<< ...