文章部分摘自网络

引言:

 工厂设计模式分为三种:

  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. View和ViewGroup的区别 -- Touch事件处理

    View.java源码: /frameworks/base/core/java/android/view/View.java View.java的 dispatchTouchEvent 方法: 经过一 ...

  2. 操作系统和Python的发展历程

    一:操作系统的发展历史: 操作系统:什么是操作系统?我们首先想到的是电脑,,也就是所谓的Windows8,Windows7,或者XP系统和Windows10,当然也包括我们手机的安卓系统或者IPhon ...

  3. datagridview用get,set访问并加锁,可以控制所有使用datagridview的地方都顺序进行访问

    public System.Windows.Forms.DataGridView dataGridView1 { get { lock (ojb) { return dataGridView; } } ...

  4. Ubuntu15.10 编译VLC Android(安卓)过程记录

    持续更新中... 最后一次修改于 2016-03-20 15:33:45 1.必要库的安装 除基本编译环境(gcc.g++等外),需要额外安装如下的库(用于下载必要的依赖文件) (1)JDK 推荐安装 ...

  5. IntelliJ IDEA配置缓存地址

    idea的配置缓存路径是保存配置文件和插件的本地目录,对idea上的所有个人修改全都储存在那里 相比于eclipse的免安装.解压即用来说,一旦系统重装或者idea重装又没有进行备份的情况下,个人对i ...

  6. 个人学习笔记--MyBatis-的搭建及第一个程序

    1.导入Jar包 2.设置全局配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE c ...

  7. django入门教程(上)

    相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站.网络应用程序以及网络服务的开发.那么为什么我们需要一个web框架,而不是直接用python来写web应用呢? ...

  8. bzoj 3858: Number Transformation 暴力

    3858: Number Transformation Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 82  Solved: 41[Submit][Sta ...

  9. 对SVM的个人理解

    对SVM的个人理解 之前以为SVM很强大很神秘,自己了解了之后发现原理并不难,不过,“大师的功力在于将idea使用数学定义它,使用物理描述它”,这一点在看SVM的数学部分的时候已经深刻的体会到了,最小 ...

  10. Mongodb使用

    Mongodb基本的原则是:条件句是内层文档的键,修改器是外层文档的键[即,修改器要修改的字段声明在修改器内部].1.$size,用于查询数组大小为size的记录db.a.find({"co ...