工厂模式(Factory Pattern)
一、工厂模式(Factory Pattern)的介绍
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。使用工厂模式可能会多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
二、工厂模式的分类
1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式
三、简单工厂模式
1.父类产品
/**
* 父类产品
*/
public class Product {
public Product(){
System.out.println("------product------");
}
public void change(){
System.out.println("-----父类方法------");
}
}
· 2. A B C 三种子类产品
//子类产品A
public class ProductA extends Product {
public ProductA() {
System.out.println("------产品A------");
}
@Override
public void change() {
System.out.println("------方法A------");
}
}
//子类产品B
public class ProductB extends Product {
public ProductB() {
System.out.println("------产品B------");
} @Override
public void change() {
System.out.println("------方法B------");
}
}
//子类产品C
public class ProductC extends Product {
public ProductC() {
System.out.println("------产品C------");
} @Override
public void change() {
System.out.println("------方法C------");
}
}
3、创建产品的工厂类
工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
/**
* 创建产品的工厂
*/
public class Factory { /**
* 静态方法,直接调用
* 自动向上转型,转为product
*/
public static Product createProduct(String param){
if (param.equals("A")){
Product productA = new ProductA();
return productA;
}else if (param.equals("B")){
Product productB = new ProductB();
return productB;
}else if (param.equals("C")){
ProductC productC = new ProductC();
return productC;
}
return new Product();
} public static void change(Product product){
product.change();
}
}
4、比较普通创建对象的方法和测试简单工厂方法
public class TestProduct {
@Test
public void test1(){
/**
* 没有工厂模式
* 每个产品都需要创建
*/
ProductA productA = new ProductA();
ProductB productB = new ProductB();
ProductC productC = new ProductC();
System.out.println("------productA------" + productA);
System.out.println("------productB------" + productB);
System.out.println("------productC------" + productC);
}
@Test
public void test2(){
/**
* 工厂设计
* 参数不同,返回产品不同
* 向下转型,和本身的类型相关
*/
ProductA productA = (ProductA) Factory.createProduct("A");
ProductB productB = (ProductB) Factory.createProduct("B");
ProductC productC = (ProductC) Factory.createProduct("C");
System.out.println("------productA------" + productA);
System.out.println("------productB------" + productB);
System.out.println("------productC------" + productC);
// 多态测试
Factory.change(productA);
Factory.change(productB);
Factory.change(productC);
}
}
5.小结简单工厂
简单工厂的所有产品都是在一个工厂生产的,通过在构造时判断传入的参数不同来生产不同的产品,这种模式会随着产品的增加而越来越庞大,每次新增产品都要添加修改判断条件,即修改工厂类,给维护和扩展带来不便。并且一但工厂类中出错,所有产品都无法创建了。
四、工厂方法模式
1.抽象产品工厂类
工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
/**
* 抽象产品工厂类
* Product为抽象产品
*/
public abstract class Factory {
abstract Product create();
}
2.具体的A、B工厂类
2个工厂都继承抽象工厂类,它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
/**
* A工厂生产A产品
*/
public class AFactory extends Factory {
@Override
public Product create() {
return new ProductA();
}
} /**
* B工厂生产B产品
*/
public class BFactory extends Factory {
@Override
Product create() {
return new ProductB();
}
}
3.抽象产品接口
它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
/**
* 抽象产品接口
*/
public interface Product {
void method();
}
4.具体产品类
A、B 产品都实现抽象产品接口
/**
* 具体产品A
*/
public class ProductA implements Product{
@Override
public void method() {
System.out.println("------ProductA------");
}
} /**
* 具体产品B
*/
public class ProductB implements Product {
@Override
public void method() {
System.out.println("------ProductB------");
}
}
5.测试工厂方法
public class TestFactoryMethod {
/**
* 创建不同的工厂,生产不同的产品
* @param args
*/
public static void main(String[] args) {
AFactory aFactory = new AFactory();
Product product = aFactory.create();
product.method();
BFactory bFactory = new BFactory();
Product product1 = bFactory.create();
product1.method();
/* 输出为:
------ProductA------
------ProductB------*/
}
}
6.小结工厂方法
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。工厂方法模式实现了不同产品在不同工厂生产,维护和扩展比简单工厂模式好,即使一个产品出现问题,其他产品也可以正常生产。
五、抽象工厂模式
1.抽象工厂类
/**
* 抽象工厂类
* 可以创建分别生产A、B产品
*/
public interface AbstractFactory { ProductA factoryA(); ProductB factoryB();
}
2.具体工厂
A1和B1是一个产品族,由具体工厂1生产;A2和B2是一个产品族,由具体工厂2生产
/**
* 具体工厂1
* 生产产品A1和B1
*/
public class Factory1 implements AbstractFactory {
@Override
public ProductA factoryA() {
return new ProductA1();
} @Override
public ProductB factoryB() {
return new ProductB1();
}
}
/**
* 具体工厂2
* 生产产品A2和B2
*/
public class Factory2 implements AbstractFactory {
@Override
public ProductA factoryA() {
return new ProductA2();
} @Override
public ProductB factoryB() {
return new ProductB2();
}
}
3.抽象产品接口
抽象产品A接口
/**
* 抽象产品A接口
*/
public interface ProductA {
}
抽象产品B接口
/**
* 抽象产品B接口
*/
public interface ProductB {
}
4.具体产品
具体产品A1,实现抽象产品A接口
/**
* 具体产品A1
*/
public class ProductA1 implements ProductA {
public ProductA1(){
System.out.println("------ProductA1------");
}
}
具体产品A2,实现抽象产品A接口
/**
* 具体产品A2
*/
public class ProductA2 implements ProductA {
public ProductA2() {
System.out.println("------ProductA2------");
}
}
具体产品B1,实现抽象产品B接口
/**
* 具体产品B1
*/
public class ProductB1 implements ProductB {
public ProductB1() {
System.out.println("------ProductB1------");
}
}
具体产品B2,实现抽象产品B接口
/**
* 具体产品B2
*/
public class ProductB2 implements ProductB {
public ProductB2() {
System.out.println("------ProductB2------");
}
}
5.测试抽象工厂
/**
* 测试抽象功能工厂
*/
public class TestAbstractFactory {
public static void main(String[] args) {
Factory1 factory1 = new Factory1();
factory1.factoryA();
factory1.factoryB(); Factory2 factory2 = new Factory2();
factory2.factoryA();
factory2.factoryB();
/* 输出
------ProductA1------
------ProductB1------
------ProductA2------
------ProductB2------*/
}
}
6.小结
抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
六、总结
简单工厂 : 用来生产同一等级结构中的任意产品,即所有产品由一个工厂生产,当需要添加新产品时,需要修改工厂类,不易扩展。
工厂方法 :用来生产同一等级结构中的固定产品,即不同的产品由不同的工厂生产,添加新产品只需要添加新工厂,更容易扩展,不过如果同一级产品有多个,会产生很多平行的工厂。
抽象工厂 :用来生产不同产品族的全部产品,即一个工厂生产一个产品族,每个产品族都是多个产品的同一级结构。
以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。
工厂模式(Factory Pattern)的更多相关文章
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- 工厂模式(factory pattern) ------创造型模式
创建型模式 简单工厂模式的缺点是: 当我们引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,需要修改工厂类的方法,违反了“开闭原则”. 工厂模式提供了一个抽象工厂接口来声明抽象工厂方 ...
- 工厂模式(factory pattern)
工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素 ...
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- 【设计模式】工厂模式 Factory Pattern
1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...
- JAVA设计模式之工厂模式—Factory Pattern
1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...
- 设计模式 - 出厂模式(factory pattern) 详细说明
出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...
- 设计模式(一)工厂模式Factory(创建型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
随机推荐
- 15、xtrabackup 全量备份
xtrabackup 全量备份与恢复 安装 yum install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2. ...
- “全栈2019”Java第八十四章:接口中嵌套接口详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- centos7 docker 安装 zookeeper 3.4.13 单机standalone
假设一台单机主机的ip分别为: 单机主机:192.168.0.200 1. 查找zookeeper镜像: docker search zookeeper 2. 下载官方zookeeper镜像: doc ...
- mysql5.7解压版版安装步骤详情
mysql有安装版和解压版之分: 安装版:以msi结尾的,这种版本优点是安装便捷,全是傻瓜式的下一步:缺点是会不自觉的安装一些我们根本不需要的组件. 解压版:以zip或者其他压缩格式结尾的,这种版本虽 ...
- ajax跨域请求问题
ajax是不允许跨域请求的,今天在使用bootstap-table的时候,data-url使用的地址是绝对地址,而非相对地址,因此在载入数据的时候就出错了. 启动的时候使用是 http://127.0 ...
- css第二篇:样式的特殊性、重要性、继承和层叠
特殊性: 假设有几个不同的规则改变的都是同一个元素的值,那么哪一个规则将会胜出呢?这就得靠特殊值啦,什么是特殊值呢?特殊值的大小呢?如下图: 值越大代表越牛,如1,0,0,0永远大于0,X,X,X ...
- windows使用putty向远程服务器传送文件
一.问题产生 对于远程服务器,我习惯把文件写好后直接上传到服务器,也有很多方法可以做到,我现在比较习惯使用putty自带的pscp直接去传. 二.解决办法 1.首先在本地下载的putty文件下看是否有 ...
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest
题目传送门 只打了三个小时. A. Broadcast Stations B. Connect3 补题:zz 题解:因为格子是4*4的,而且每次落子的位置最多是只有四个,再加上剪枝,情况不会很多,直接 ...
- 颠覆我的Thread.join()
学而时习之,不亦说乎! --<论语> 为什么说是颠覆? 1)任何对象都可以作为锁对象,锁对象的行为都是一样的吗?之前我一直认为锁对 ...
- java-web 登陆功能
目录结构 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...