Java-工厂设计模式
文章部分摘自网络
引言:
工厂设计模式分为三种:
简单工厂
工厂方法
抽象工厂
联想四种情况
(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();
}
}
Java-工厂设计模式的更多相关文章
- Java工厂设计模式
程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类 //=============================================== ...
- java工厂设计模式初步
没有利用反射机制定义的简单工厂类 interface Fruit{ public void eat(); } class Apple implements Fruit{ public void eat ...
- Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...
- 利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...
- java简单工厂设计模式
一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...
- Java设计模式—工厂设计模式
工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person(); //耦合性强 Man p = new Per ...
- Java反射机制(五):使用反射增强简单工厂设计模式
关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍: 我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...
- 工厂设计模式灵魂拷问-Java实现
show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 我们经常听到工厂模式 ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
随机推荐
- Linux-Tcp-IP
/* tcpcli.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
- OC - 正则表达式 - RegexKitLite
正则表达式使用步骤: 1. 创建正则表达式对象, 设置约束条件; NSString *pattern = @"\\d{1,3}"; NSRegularExpression *reg ...
- 导航 -MapKit - 获取路线信息绘制导航路线
#import "PPViewController.h" #import <MapKit/MapKit.h> #import "PPAnnotation.h& ...
- docker安装caffe
[最近一直想要学习caffe,但是苦苦纠结于环境安装不上,真的是第一步都迈不出去,还好有docker的存在!下面,对本人如何利用docker安装caffe做以简单叙述,不属于教程,只是记录自己都做了什 ...
- 第 13 章 装饰模式【Decorator Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> Ladies and gentlemen,May I get your attention,Please?,Now I’ ...
- spoj VFMUL FFT快速傅立叶变换模板题
题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...
- uva 10652 Board Wrapping
主要是凸包的应用: #include <cstdio> #include <cmath> #include <cstring> #include <algor ...
- 使AspNetPager控件中文显示分页信息
在日常的编程过程中,很多学员对于使AspNetPager控件中文显示分页信息不是很清楚,本文将由达内的老师为各位学员介绍一下使AspNetPager控件中文显示分页信息的内容. AspNetPager ...
- The APR based Apache Tomcat Native library
Tomcat启动的时候出现下面这样的提示: 2015-11-06 14:24:12 org.apache.catalina.core.AprLifecycleListener init 信息: The ...
- 【Xamarin挖墙脚系列:多窗口之间的导航】
原文:[Xamarin挖墙脚系列:多窗口之间的导航] 在Android中:Intent对象,通知松散耦合的Activity等组件 在IOS中:Segue对象连接视图 <button opaque ...