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. HDU2124 Repair the Wall(贪心)

    Problem Description Long time ago , Kitty lived in a small village. The air was fresh and the scener ...

  2. doc 窗口操作图

    doc 窗口操作图doc 窗口操作图vdoc 窗口操作图

  3. 【NOIP2007提高组】字符串展开

    [题外话]这道题纯粹考验耐心,某些经常调程序调到摔键盘的人可以尝试 [题外话2]除了考耐心以外完全没有什么难点 [题外话3]也许会稍微恶心一点? [题外话4]其实我是在别人军训的时候滚来更博客的简直2 ...

  4. 越狱开发-创建真正的后台程序(Daemon Process)

    在网上搜索了一下如何在IOS上面实现Daemon Process,只有chrisalvares的博客中有过详细的描述,但是其博客中描述的较为复杂, 参考stackoverflow中的一个问答: htt ...

  5. [ An Ac a Day ^_^ ] CodeForces 525B Pasha and String 技巧

    题意就是一次次翻转字符串 然后输出最终的字符串 暴力一发O(n*m)果然超时了 因为每次翻转的的都是a-1到对称位置 所以一个位置翻转两次等于没有操作 所以只需要记录一下len/2的位置前的操作次数 ...

  6. 五指cms模版基础

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 酷比魔方 iwork10 旗舰版

    平板电脑自带的win10的一键恢复不是一般的慢,简直慢出个性了,历经5个小时...必须是个有耐心的人才敢一键恢复,不然强制关机就变砖了...

  8. SQL 课程

    今天,我主要学习了数据库的基本查询,模糊查询.排序查询.聚合函数.计数和分组,以及数学函数.字符串函数.时间日期函数. create database lianxi0720gouse lianxi07 ...

  9. java求阶乘

    //阶乘 public static int rec(int n){ if(n==1){ return 1; }else{ return n*rec(n-1); } }

  10. 免费开源的boostrap模板

    百度查不到,奶奶的,百度好多国外技术类文章的都查不到 https://colorlib.com/wp/free-html5-admin-dashboard-templates/ 有没有FQ软件介绍呀?