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 单例模式类图 ...
随机推荐
- OS概论1
1.设计现代OS的主要目标是什么? 在计算机上配置操作系统,其主要目标是:方便性,有效性,可扩充性,开放性. 一个没有OS的操作系统,就必须用机器语言书写程序,如果在计算机上配置了OS,系统便可以使用 ...
- NotePad++更改背景颜色
白色的编辑框看得眼睛不舒服,怎么样更改NotePad++的背景颜色使眼睛更舒服些? 1.设置--语言格式设置 2.设置背景色 “背景色”一栏,选择背景色颜色 “使用全局背景色”一栏要打上√,否则无 ...
- bzoj4038: 医疗援助
Description 一只带着先进设备和药物的医疗团队来到了埃博拉病毒疫区的某个非洲国家.这个国家有n个村庄,均坐落在该国唯一的一条公路旁,n个村庄依次标号为1,2,…n.第i个村庄有a_i个埃博拉 ...
- Uva10766 Organising the Organisation
题目链接戳这里 基尔霍夫矩阵裸题.构建基尔霍夫矩阵(度数矩阵-邻接矩阵),求他的任意\(n-1\)阶主子式的绝对值即为答案. 这题开始用java写,结果BigInteger太慢Tle了. 后来用c++ ...
- Table嵌套去掉子table的外边框
Table表格去掉子表格的边框 1. 父表格 <table align="center" style="border:none;cell-padding:0; ce ...
- c# gzip解压缩
, bytes.Length)) > ) { line = System.Text.Encoding.Defaul ...
- QT事件研究的文章
我始终认为,Windows里最重要的不是API,而是消息.同理,QT里最重要的是事件.然而我对事件的原理和用法至今不是很理解,先放几篇文章在这里,有空回来细细研读: http://m.blog.chi ...
- 解析Android开发优化之:对Bitmap的内存优化详解
在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...
- Android 通过代码设置radiobutton不同方位图标的两种方法
更换radiobutton中的图片在xml中很好设置,但对于初学者如何在代码中设置还是不容易找的.没法子,通过看原版api找到两个方法,setCompoundDrawables和setCompound ...
- Knockout绑定audio的pause事件导致音频无法停止
...时间过得真快, 一晃4天已经过去了, 然而自己并没有动笔写什么. 自省. 看了看今天的工作, 感觉好像没什么可写的. 不禁在想是不是一天一篇有点儿难. 再一想, 这分明就是在给自己找理由. 就是 ...