设计模式 | 抽象工厂模式(abstract factory)
定义:
结构:(书中图,侵删)

实例:
package designpattern.abstractfactory;
public abstract class Employee {
private String name;
abstract void insert(Employee employee);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Employee [name=" + name + "]";
}
}
package designpattern.abstractfactory;
public class OracleEmployee extends Employee {
@Override
void insert(Employee employee) {
System.out.println("往oracle数据库插入一条Employee员工数据:" + employee);
}
}
package designpattern.abstractfactory;
public class MysqlEmployee extends Employee {
@Override
public void insert(Employee employee) {
System.out.println("往mysql数据库插入一条Employee员工数据:" + employee);
}
}
package designpattern.abstractfactory;
public abstract class Department {
String name;
abstract void insert(Department department);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Department [name=" + name + "]";
}
}
package designpattern.abstractfactory;
public class OracleDepartment extends Department {
@Override
void insert(Department department) {
System.out.println("往oracle数据库插入一条Department部门数据:" + department);
}
}
package designpattern.abstractfactory;
public class MysqlDepartment extends Department {
@Override
void insert(Department department) {
System.out.println("往mysql数据库插入一条Department部门数据:"+department);
}
}
package designpattern.abstractfactory;
public interface Factory {
Employee createEmployee();
Department createDepartment();
}
package designpattern.abstractfactory;
public class MysqlFactory implements Factory {
@Override
public Employee createEmployee() {
return new MysqlEmployee();
}
@Override
public Department createDepartment() {
return new MysqlDepartment();
}
}
package designpattern.abstractfactory;
public class OracleFactory implements Factory {
@Override
public Employee createEmployee() {
return new OracleEmployee();
}
@Override
public Department createDepartment() {
return new OracleDepartment();
}
}
package designpattern.abstractfactory;
public class Client {
public static void main(String[] args) {
Factory factory = new MysqlFactory();
// Factory factory=new OracleFactory();
Employee employee = factory.createEmployee();
employee.setName("张三");
employee.insert(employee);
Department department = factory.createDepartment();
department.setName("技术部");
department.insert(department);
}
}
往mysql数据库插入一条Employee员工数据:Employee [name=张三]
往mysql数据库插入一条Department部门数据:Department [name=技术部]
package designpattern.abstractfactory;
public class SimpleFactory {
static String db = "mysql";
//static String db="oracle";
static Employee createEmployee() {
switch (db) {
case "mysql":
return new MysqlEmployee();
case "oracle":
return new OracleEmployee();
default:
return null;
}
}
static Department createDepartment() {
switch (db) {
case "mysql":
return new MysqlDepartment();
case "oracle":
return new OracleDepartment();
default:
return null;
}
}
}
package designpattern.abstractfactory;
public class Client2 {
public static void main(String[] args) {
Employee employee = SimpleFactory.createEmployee();
employee.setName("张三");
employee.insert(employee);
Department department = SimpleFactory.createDepartment();
department.setName("技术部");
department.insert(department);
}
}
package designpattern.abstractfactory;
public class ReflectSimpleFactory {
static String db = "Mysql";
// static String db="Oracle";
static String path = "designpattern.abstractfactory";// 包路径
static Employee createEmployee() {
try {
Class<Employee> employee = (Class<Employee>) Class.forName(path + "." + db + "Employee");
return employee.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
static Department createDepartment() {
try {
Class<Department> department = (Class<Department>) Class.forName(path + "." + db + "Department");
return department.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
package designpattern.abstractfactory;
public class Client3 {
public static void main(String[] args) {
Employee employee = ReflectSimpleFactory.createEmployee();
employee.setName("张三");
employee.insert(employee);
Department department = ReflectSimpleFactory.createDepartment();
department.setName("技术部");
department.insert(department);
}
}
package designpattern.abstractfactory; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class ReflectSimpleFactory2 { static String path = "designpattern.abstractfactory";// 包路径 static Employee createEmployee() {
try {
Class<Employee> employee = (Class<Employee>) Class.forName(path + "." + getDBName() + "Employee");
return employee.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
} static Department createDepartment() {
try {
Class<Department> department = (Class<Department>) Class.forName(path + "." + getDBName() + "Department");
return department.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
} private static String getDBName() {
String dbName = null;
try {
InputStream in = ReflectSimpleFactory2.class.getResourceAsStream("db.properties");
Properties pro = new Properties();
pro.load(in);
in.close();
dbName = pro.getProperty("db");
} catch (IOException e) {
e.printStackTrace();
} return dbName; }
}
db=Mysql
#db=Oracle
package designpattern.abstractfactory;
public class Client4 {
public static void main(String[] args) {
Employee employee = ReflectSimpleFactory2.createEmployee();
employee.setName("张三");
employee.insert(employee);
Department department = ReflectSimpleFactory2.createDepartment();
department.setName("技术部");
department.insert(department);
}
}
总结:
设计模式 | 抽象工厂模式(abstract factory)的更多相关文章
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
- Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)
抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创 ...
- 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例
1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- 抽象工厂模式(Abstract Factory)C#实例
抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...
随机推荐
- AngularJS 最常用的几种功能
AngularJS 最常用的几种功能 2017-04-13 吐槽阿福 互联网吐槽大会 第一 迭代输出之ng-repeat标签ng-repeat让table ul ol等标签和js里的数组完美结合 1 ...
- 使用jmeter 进行接口的性能测试
1.启动jmeter:在bin下以管理员身份运行jmeter.bat,启动jmeter 2. 创建测试计划: 默认启动jmeter时会加载一个测试技术模板,保存测试计划:修改名称为Apitest,点击 ...
- 那些年,我们追过的RPC
1974年冬,互联网大师 Jon Postel发表了RFC674:“Procedure Call Protocol Documents,Version 2”,尝试定义一种在包含70个节点的网络中共享资 ...
- 小程序开发之图片转Base64(C#、.et)
小程序页面代码因为某些人力不可控的代码丢失了,这里简单说明一下 调用小程序APIwx.chooseImage(OBJECT)选择相册或拍摄照片,会返回 tempFilePaths,之后通过wx.upl ...
- 微信公众号 模板消息 定时推送 java
前提:业务需要,要做一个关于月报的微信消息推送.即每个月定时自动发送一条消息 给关注 公众号的人 用的是 公众号的测试账号(实际开发需要认证的公众号) 微信官网的 模板消息接口规则: 1.所有服务号都 ...
- MySQL,简单了解下、
第一章 数据备份与导入导出 1.1.备份基本概念介绍 1.2.mysqldump详解 1.3.mydumper浅析 1.4.MySQL物理备份基本操作 1.5.了解mysqlpump工具 1.6.数据 ...
- C++/C实现各种排序算法(持续更新)--冒泡排序,选择排序,归并排序
2018 3 17 今日总结一下C++中的排序算法: 1冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...
- WebJars
WebJarsWebJars是一个很神奇的东西,可以让大家以jar包的形式来使用前端的各种框架.组件. 什么是WebJars 什么是WebJars?WebJars是将客户端(浏览器)资源(JavaSc ...
- linux系统安装mysql
所有平台的Mysql下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server版本及对应的平台. 接下来我们在 Centos 系统下使用 yum 命令安装 MySql ...
- Java 学习笔记 (四) Java 语句优化
这个问题是从headfirst java看到的. 需求: 一个移动电话用的java通讯簿管理系统,要求最有效率的内存使用方法. 下面两段程序的优缺点,哪个占用内存更少. 第一段: Contact[]c ...