java常用设计模式二:工厂模式
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常用设计模式二:工厂模式的更多相关文章
- Java常见设计模式之工厂模式
工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple F ...
- Java设计模式02:常用设计模式之工厂模式(创建型模式)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- JAVA常用设计模式(一、单例模式、工厂模式)
JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
随机推荐
- Django import相关
from django.shortcuts import render,redirect from django.contrib.auth import authenticate,logout,log ...
- Java03-Java语法基础(二)运算符
Java语法基础(二)运算符 一.运算符 1.算数运算符:+.-.*./.% 1)双目运算符:二元运算符,参加运算的对象有两个(+.-.*./.%) 2)单目运算符:一元运算符,参加运算的对象只有一个 ...
- AngularJS——第6章 作用域
第6章 作用域 在AngularJS中使用过滤器格式化展示数据,在"{{}}"中使用"|"来调用过滤器,使用":"传递参数. 6.1 内置过 ...
- composer ip2city配置
//根据ip获取地址信息composer require "mylukin/ip2city: dev-master" // vendor/mylukin/ip2city/src/I ...
- go语言中的反射reflect
package main; import ( "fmt" "reflect" ) //反射refection //反射使用TypeOf和ValueOf函数从接口 ...
- jquery插件之选项卡
jQuery插件编写 首先来一个简拓展jQuery对象的方法 <body > <p>23</p> <script src="js/jquery-1. ...
- 分享插件的使用加一个echart走数据
html部分: <div class="topLink clearfix bdsharebuttonbox bdshare-button-style0-16" data-b ...
- SSI服务端包含技术
1.页面拆出来怎么样通过web服务浏览呢? 使用web服务(例如nginx)的SSI技术,将多个子页面合并渲染输出. 2.SSI是什么? 3. ssi包含类似于jsp页面中的incluce指令,ssi ...
- BPF+XDP比较全的资料都在这里
Dive into BPF: a list of reading material Sep 1, 2016 • Quentin Monnet◀Table of contents What is BPF ...
- 如何快速学好Shell脚本?
Shell 语言作为类 Unix 系统的原生脚本,有着非常实用的价值.但对于很多刚刚接触 Shell 脚本的同学来说,搞懂 Shell 语言的语法却是一件非常困难的事情.甚至有人吐槽,或许没有谁能清楚 ...