工厂模式(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操作符直接生成对象会带来一些问题. ...
随机推荐
- Linux 下安装 resync 介绍
Linux 下安装 resync 介绍 这是官网,找到对应版本的下载地址. 这里提供Linux_X64的安装包 wget '' https://download-cdn.resilio.com/sta ...
- Arch下error: signature from "NAME<EMAIL ADD>"
pacman的unknown trust问题错误消息类似于:error: signature from "NAME<EMAIL ADD>" is unknown tru ...
- linux开机、重启和用户登陆注销
关机&重启命令 基本介绍: shutdown –h now 立该进行关机 shudown -h 1 "hello, 1 分钟后会关机了" shutdown –r no ...
- Mondrian Schema Workbench 概念及常用参数
Schema Schema 定义了一个多维数据库.包含了一个逻辑模型,而这个逻辑模型的目的是为了书写 MDX 语言的查询语句.这个逻辑模型实际上提供了这几个概念: Cubes (立方体).维度( Di ...
- python 获取文件路径
一种是获取当前你正在操作文件的路径 一种是获取你执行文件的路径(比如你在你调用的包里面更改了,执行的时候就不会找你的包的路径,而是你执行文件的路径)
- python之类与对象(5)
6. 类的多继承与超继承 6.1 多继承 python的类还有一个特点,就是可以继承多个类.但是我们作为测试人员,在实际中很少用到这个多继承,这里不就详细(一直都不详细,hhhh)写了.上代码: #! ...
- rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)
rest-assured从2.1.0版本开始支持 Schema 验证,包括JSON Schema validation及Xml Schema validation.我们之前断言响应体都是一个一个字段 ...
- Vue项目中用的Jquery.js和easing.js做的抛物线
如果项目中还用到自有的$ <script> jQuery.noConflict();</script> //星星掉落movePathNew(args) { let self = ...
- 分享一下Ubuntu好用的源
vim /etc/apt/sources.list 然后用G跳转到最后一行,然后[ESC]切换到命令行模式,然后键入[o](表示在当前行后插入).也可以多插入几个空行.这样可以有条理的和系统默认的区分 ...
- Storm个人学习总结
https://www.jianshu.com/p/c7fba7d6a24d https://www.cnblogs.com/peak-c/p/6297794.html https://blog.cs ...