Java设计模式之创建型模式--工厂方法及抽象工厂模式
来源:互联网 发布:网络购物市场交易规模 编辑:程序博客网 时间:2024/06/07 23:04
一:工厂方法
1.我们先看类图
2.工厂方法是针对每一种产品提供一个工厂类,比如我是生产A类产品的,但是A类产品又分为google旗下和华为旗下,这是我需要提供两个工厂,每个工厂生产属于自己的产品A。
3.关于工厂,还有一个简单工厂就不介绍了,它只是在创建产品A的时候,传入不同的参数加以识别,从而创建相应的产品。在这里就不演示了。
4.工厂方法的代码如下:
//创建产品基类public interface ProdcutA { void getName();}//创建Google和华为旗下的产品public class GoogleProductA implements ProdcutA { @Override public void getName() { System.out.println("google公司下的产品A"); }}public class HuaWeiProductA implements ProdcutA { @Override public void getName() { System.out.println("华为公司下的产品A"); }}//紧接着,我们定义一个生产产品A的工厂public interface IFactory { ProdcutA createProductA();}//创建Google和华为工厂public class GoogleFatory implements IFactory { @Override public ProdcutA createProductA() { return new GoogleProductA(); }}public class HuaWeiFatory implements IFactory { @Override public ProdcutA createProductA() { return new HuaWeiProductA(); }}//测试 public static void main(String[] args) { ProdcutA prodcutA; //创建google工厂 IFactory factory = new GoogleFatory(); //google工厂生产产品A prodcutA = factory.createProductA(); prodcutA.getName(); //创建华为工厂 factory = new HuaWeiFatory(); //华为工厂生产产品A prodcutA = factory.createProductA(); prodcutA.getName(); } //结果 google公司下的产品A 华为公司下的产品A
5.小结
所以对于工厂方法,我们可以增加同一等级下的任意产品,比如这是我们又需要增加OPPO公司下的产品A,这时,我们只需创建OPPO下的产品A和OPPO工厂即可,不需要修改原有的类。但是工厂方法只局限于同一等级的产品。如果我们需要每个公司都要生产产品A,B。(比如A表示手机,B表示汽车)他们属于不同等级的。那么我们用工厂方法无法实现,这时我们就需要抽象工厂来实现了。下面介绍一下抽象工厂。
二:抽象工厂模式
1.我们还是先看类图
2.抽象工厂是针对产品族而生,我们可以创建A,B…一系列的产品,我们可以很容易的增加产品线。比如原本Google只生产产品A,当Google能生产产品B时,这时我们只需新建一个Google产品B的工厂就行了。不需要修改IFactory中的任何东西。
3.下面看一下源码:
//创建产品//产品A,产品A与上述一致//产品Bpublic interface ProdcutB { void getName();}//具体的产品public class GoogleProductB implements ProdcutB { @Override public void getName() { System.out.println("google公司下的产品B"); }}public class HuaWeiProductB implements ProdcutB { @Override public void getName() { System.out.println("华为公司下的产品B"); }}//创建工厂//首先是抽象工厂,提供生产产品A,B的方法public interface IFactory { ProdcutA createProductA(); ProdcutB createProductB();}//接着创建具体的工厂,google工厂和华为工厂public class GoogleFatory implements IFactory { @Override public ProdcutA createProductA() { return new GoogleProductA(); } @Override public ProdcutB createProductB() { return new GoogleProductB(); }}public class HuaWeiFatory implements IFactory { @Override public ProdcutA createProductA() { return new HuaWeiProductA(); } @Override public ProdcutB createProductB() { return new HuaWeiProductB(); }}//测试public static void main(String[] args) { //工厂 IFactory factory; //产品A ProdcutA prodcutA; //产品B ProdcutB prodcutB; //创建google工厂 factory = new GoogleFatory(); //google工厂生产产品A和B prodcutA = factory.createProductA(); prodcutB = factory.createProductB(); prodcutA.getName(); prodcutB.getName(); //创建华为工厂 factory = new HuaWeiFatory(); //华为工厂生产产品A和B prodcutA = factory.createProductA(); prodcutB = factory.createProductB(); prodcutA.getName(); prodcutB.getName(); } //结果 google公司下的产品A google公司下的产品B 华为公司下的产品A 华为公司下的产品B
4.小结
前面也说了,抽象工厂是针对产品族的。虽然我们能很好的处理新的产品族,如果我们新增一类产品C,我们还是没有办法去不修改基类的情况来实现,但这样又违背开闭原则(OCP),所以,这也是抽象工厂的缺点之一。
三:总结
简单工厂实用性实在太低了,所以一般我们也会选择工厂方法/抽象工厂。因为简单工厂动不动就违背了开闭原则。对于工厂方法和抽象工厂,我们视情况而用,如果只是生产这一类的产品(如不同公司下的产品A),那么我们就选用工厂方法;如果是一系列的产品(如不同公司下的产品A,B...),那么我们选用抽象工厂。
阅读全文
0 0
- Java设计模式之创建型模式--工厂方法及抽象工厂模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- java设计模式之创建型模式-抽象工厂模式
- Java设计模式 之 工厂模式及抽象工厂模式
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- java设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- java设计模式-创建模式之 简单工厂,工厂方法和抽象工厂的区别总结
- 创建型设计模式之抽象工厂方法模式
- java设计模式(创建型)之抽象工厂模式
- java设计模式之创建型模式-工厂方法模式
- 面向对象之关键字final
- Android学习笔记——Intent
- 百度站内搜索代码
- java list 交集 并集 差集 去重复并集
- ISP-坏点校正(DPC)
- Java设计模式之创建型模式--工厂方法及抽象工厂模式
- bzoj 2592 [Usaco2012 Feb]Symmetry
- C++ STL容器
- angularJs路由操作实例(一)
- 关于logicbrick(xylon)的ip安装
- SSM(spring+spring mvc+mybatis)框架搭建
- 【机器学习实战】Machine Learning in Action 代码 视频 项目案例
- 6、vim常用操作
- Spring MVC 跨域问题