1、简单工厂模式(静态工厂方法模式)

抽象实例:

public interface People {
void talk();
}

具体实例:

public class Doctor implements People {
public void talk() {
System.out.println("我是医生");
}
}
public class Teacher implements People {
public void talk() {
System.out.println("我是教师");
}
}

具体工厂

public class Factory {
public static People createInstance(String flag){
if("doctor".equals(flag)){
return new Doctor();
}
if("teacher".equals(flag)){
return new Teacher();
}
return null;
}
}

测试类:

public class Test {
public static void main(String[] args){
People people = Factory.createInstance("doctor");
people.talk();
people = Factory.createInstance("teacher");
people.talk();
}
}
我是医生
我是教师

该模式的缺点:增加 具体实例  需要修改工厂类

2、工厂方法模式

抽象实例:

public interface People {
void talk();
}

具体实例:

public class Doctor implements People {
public void talk() {
System.out.println("我是医生");
}
}
public class Teacher implements People {
public void talk() {
System.out.println("我是教师");
}
}

抽象工厂

public abstract class AbstractFactory {
abstract People createInstance();
}

具体工厂

public class DoctorFactory extends AbstractFactory {
People createInstance() {
return new Doctor();
}
}
public class TeacherFactory extends AbstractFactory {
People createInstance() {
return new Teacher();
}
}

测试类:

public class Test {
public static void main(String[] args){
AbstractFactory doctorFactory = new DoctorFactory();
AbstractFactory teacherFactory = new TeacherFactory();
doctorFactory.createInstance().talk();
teacherFactory.createInstance().talk();
}
}
我是医生
我是教师

该模式的相对于 简单工厂模式 来说,如果要增加新的 具体实例  不需要修改原来的工厂方法,只需要新增一个 具体工厂。缺点就是当 具体实例 很多的时候,会增加很多与之对应的 具体工厂

3、抽象工厂模式

抽象实例和具体实例和前面的一样,此处省略不写

抽象工厂

public interface AbstractFactory {
People createDoctorInstance();
People createTeacherInstance();
}

具体工厂

public class ConcreteFactory  implements AbstractFactory {

    public People createDoctorInstance() {
return new Doctor();
} public People createTeacherInstance() {
return new Teacher();
}
}

测试类:

public class Test {
public static void main(String[] args){
AbstractFactory doctorFactory = new ConcreteFactory();
doctorFactory.createDoctorInstance().talk();
doctorFactory.createTeacherInstance().talk();
}
}
我是医生
我是教师

该模式缺点和简单工厂模式一样:增加 具体实例 需要修改 工厂类。

4、工厂模式与反射结合,实现新增 具体实例 不需要修改和新增 工厂类

抽象实例和具体实例和前面的一样,此处省略不写

具体工厂

public class ReflectFactory {
public People createInstance(String className) throws Exception {
Class<?> cls = Class.forName(className);
People people = (People) cls.newInstance();
return people;
}
}

测试类:

public class Test {
public static void main(String[] args) throws Exception {
ReflectFactory reflectFactory = new ReflectFactory();
reflectFactory.createInstance("factory.demo.Doctor").talk();
reflectFactory.createInstance("factory.demo.Teacher").talk();
}
}
我是医生
我是教师

java常用设计模式二:工厂模式的更多相关文章

  1. Java常见设计模式之工厂模式

    工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类:     1)简单工厂模式(Simple F ...

  2. Java设计模式02:常用设计模式之工厂模式(创建型模式)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.  工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...

  3. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  4. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  9. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

随机推荐

  1. HDU 1698 Just a Hook(线段树区间更新查询)

    描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...

  2. selenium学习一

    chrome版本和chromedriver的对应关系 chromedriver版本 支持的Chrome版本 v2.40 v66-68 v2.39 v66-68 v2.38 v65-67 v2.37 v ...

  3. ARM板移植udev-126

    下载udev-126.tar.xz 下载的网址为: https://mirrors.edge.kernel.org/pub/linux/utils/kernel/hotplug/ 解压文件并且编译 # ...

  4. AndroidManifest中注册application

    <application android:icon="@drawable/icon1" android:label="@string/app_name" ...

  5. IIS 7.5 上传文件大小限制

    上传插件:uploadify IIS版本:7.5 描述: 从IIS6升级到IIS7.5以后,网站上传文件大小被限制了,在Chrome下提示:ERR_CONNECTION_RESET,网上的各种方法都试 ...

  6. ASCII、Unicode和UTF-8编码的区别;中英文混合截取

    ASCII编码是128个字符 中国把汉字编入GB2312,Shift_JIS/Euc-kr各国标准..... Unicode是为了解决各国乱码的,但浪费存储空间 UTF-8编码把一个Unicode字符 ...

  7. 整理 oracle异常错误处理

    5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...

  8. angular2.0学习笔记4.npm常用指令记录及angular语法

    以下命令,都需要在命令行窗口中,先切入到项目文件夹目录,再执行 1.npm start 这个命令会在“监听”模式下运行TypeScript编译器,当代码变化时,它会自动重新编译. 同时,该命令还会在浏 ...

  9. hdu 1255(线段树 扫描线) 覆盖的面积

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...

  10. TCP窗口扩大选项

    TCP窗口扩大选项(TCP Window Scale Option) TCP窗口扩大选项 TCP Window Scale Option (WSopt) 窗口扩大选项用于扩大TCP通告窗口,使TCP的 ...