1.简单工厂模式

  在不考虑扩展的情况下还是很好用的,其实我们写代码也很经常用到,其主要理解在于传入不同参数则构建不同对象,只有一个工厂,如需添加产品涉及到扩展需要修改比较多的东西,不符合开闭原则,如下例子所示,传入A则获得ABook,传入B则获得BBook:

package main.java.com.learn.factory.factory;

public interface Book {

    void getKnowledge();
}
package main.java.com.learn.factory.factory;

public class ABook implements Book{

    @Override
public void getKnowledge() {
System.out.println("获得A知识");
}
}
package main.java.com.learn.factory.factory;

public class BBook implements Book{
@Override
public void getKnowledge() {
System.out.println("获得B知识");
}
}
package main.java.com.learn.factory.factory;

public class SimpleBookFactory {

    public static Book create(String type) {
if ("A" == type)
return new ABook();
else
return new BBook();
}
}
package main.java.com.learn.factory.factory;

/**
* Created by garfield on 2016/6/13.
*/
public class SimpleBookFactoryTest { public static void main(String[] args){
Book a = SimpleBookFactory.create("A");
Book b = SimpleBookFactory.create("B");
a.getKnowledge();
b.getKnowledge();
}
}

输出结果:

获得A知识
获得B知识

2.工厂模式

  工厂模式其实就是在简单工厂的基础上将创建对象的逻辑挪到客户端,如此一来便于扩展类的种类,但是麻烦了客户端的编辑,下面例子其实就是在原有Book类的基础上将逻辑封装成工厂:

  三个基础Book类不变;

package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public abstract class Creator {
abstract Book create();
}
package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public class ACreatorFactory extends Creator {
@Override
Book create() {
return new ABook();
}
}
package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public class BCreatorFactory extends Creator {
@Override
Book create() {
return new BBook();
}
}
package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public class FactoryTest { public static void main(String[] args){
Creator creator = new ACreatorFactory();
Creator creator2 = new BCreatorFactory();
Book a = creator.create();
Book b = creator2.create();
a.getKnowledge();
b.getKnowledge(); }
}

  输出结果:

获得A知识
获得B知识

3.抽象工厂模式

  虽然工厂模式使得逻辑更加清晰,扩展变得独立,但是如果需要增加类的种类,需要增加的工厂数量也同步增长,这也为扩展带来了不小负担,这也是抽象工厂与之的差别;

  三个基础类依然不变,但是工厂不再是单一产品的工厂,工厂可以创建产品簇:

package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public abstract class Creator {
abstract ABook createA();
abstract BBook createB(); }
package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public class Factory extends Creator {
@Override
ABook createA() {
return new ABook();
} @Override
BBook createB() {
return new BBook();
}
}
package main.java.com.learn.factory.factory.abstractFactory;

/**
* Created by garfield on 2016/6/13.
*/
public class AbstractFactoryTest {
public static void main(String[] args){
Creator creator = new Factory();
ABook a = creator.createA();
BBook b = creator.createB();
a.getKnowledge();
b.getKnowledge();
}
}

  测试结果:

获得A知识
获得B知识

java设计模式案例详解:工厂模式的更多相关文章

  1. java设计模式案例详解:代理模式

    代理模式就是用一个第三者的身份去完成工作,其实际意义跟字面意思其实是一样的,理解方式有很多,还是例子直观. 本例的实现类是实现买票功能,实际应用想要添加身份验证功能,利用代理模式添加验证步骤.上例子: ...

  2. java设计模式案例详解:观察者模式

    观察者模式的应用场景: 1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变. 2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节. 举个例子说明,这个例子讲 ...

  3. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  4. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  5. java反射案例详解

    白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * * ...

  6. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  7. 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式

    摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...

  8. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  9. JAVA设计模式(二)工厂模式

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

随机推荐

  1. Spring MVC Flash Attribute

    转自:Spring MVC Flash Attribute 的讲解与使用示例 Spring MVC 3.1版本加了一个很有用的特性,Flash属性,它能解决一个长久以来缺少解决的问题,一个POST/R ...

  2. <?php function say() { echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

    <?php function say() {     echo 'hello world'; } //在这里调用函数 say(); php 调用方法say()

  3. HDU 3404&POJ 3533 Nim积(二维&三维)

    (Nim积相关资料来自论文曹钦翔<从"k倍动态减法游戏"出发探究一类组合游戏问题>) 关于Nim积计算的两个函数流程: 代码实现如下: ][]={,,,}; int N ...

  4. Java 集合 LinkedList的ListIterator

    Java 集合 LinkedList的ListIterator @author ixenos 摘要:ListIterator<E>是继承自Iterator<E>的接口.list ...

  5. mac下安装composer

    打开命令后 cd /usr/local/bin 然后执行 curl -sS https://getcomposer.org/installer | php 接下来 sudo mv composer.p ...

  6. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  7. yii框架中关于控制器中filter过滤器和外部action的使用

    在yii框架中,控制器的过滤器分为执行前和执行后,这里举例是在执行控制器前的过滤. 需要在components/文件夹下定义公共的TestAction.php文件,并且实现run()方法.这个acti ...

  8. contenteditable模仿textarea文本框

    contenteditable 属性是 HTML5 中的新属性. 例子:<p contenteditable="true" style=" border:solid ...

  9. CentOS 6下的VPN搭建

    PPTP 全称为 Point to Point Tunneling Protocol — 点到点隧道协议,是VPN协议中的一种.虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时 ...

  10. 表单属性问题readonly、disabled、checked,prop的使用

    获取在匹配的元素集中的第一个元素的属性值. 随着一些内置属性的DOM元素或window对象,如果试图将删除该属性,浏览器可能会产生错误.jQuery第一次分配undefined值的属性,而忽略了浏览器 ...