设计模式--工厂模式
来源:互联网 发布:python 游戏编程 pdf 编辑:程序博客网 时间:2024/05/17 09:43
1. 模式作用
轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程。
2. 分类
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三类:
- 1)简单工厂模式(Simple Factory) (又称静态工厂模式)
- 2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
也有将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
3. 简单工厂模式
角色:
- 抽象产品角色:多个产品的接口或(抽象类),方便工厂类返回结果。
- 具体产品角色
- 抽象工厂模式
例如生成多种型号的宝马车,普通的方式我们每次都new车的对象,如下:
public class BMW320 { ... } public class BMW523 { ...}public class Customer { public static void main(String[] args) { BMW320 bmw320 = new BMW320(); BMW523 bmw523 = new BMW523(); } }
简单工厂实现
抽象产品及具体产品
abstract class BMW { public BMW(){ } } public class BMW320 extends BMW { public BMW320() { System.out.println("制造-->BMW320"); } } public class BMW523 extends BMW{ public BMW523(){ System.out.println("制造-->BMW523"); } }
抽象工厂
public class Factory { public BMW createBMW(int type) { switch (type) { case 320: return new BMW320(); case 523: return new BMW523(); default: break; } return null; } } //用if也是一样效果
在需要类的时候,直接实例化工厂,调用工厂带参数的方法来获取对象。如:
Factory factory = new Factory();
BMW bmw320 = factory.createBMW(320);
BMW bmw523 = factory.createBMW(523);
4. 工厂方法模式
当生产的产品增多时,在简单工厂模式下,每次得在工厂中增加生产产品的代码,由于是一个工厂生产。不符合设计的解耦要求。引入工厂方法模式可解决这类问题。
工厂方法模式中,将工厂抽象出来。
角色
- 工厂接口:与调用者直接交互用来提供产品,可以是接口或抽象类。
- 工厂实现:决定如何实例化产品。有多少产品,就有多少工厂实现。
- 产品接口
- 产品实现
注:简单工厂模式中只有三要素,没有工厂接口。一般获得产品的方法是静态的。工厂的扩展性弱。
工厂方法实现
//1.工厂接口public interface IFactory{ public IProduct createProduct();}//2.工厂实现public class Factory implements IFactory{ @override public IProduct createProduct(){ //work... }}//3.产品接口inteface IProduct { public void productMethod();}//4.产品实现public class Product implements IProduct{ @override public void productMethod(){ //... }}
举例:
产品类(产品接口一个,为了同一产品;产品实现多个,每个产品都有产品实现类)
//产品接口abstract class BMW { public BMW(){ } } //多个产品实现public class BMW320 extends BMW { public BMW320() { System.out.println("制造-->BMW320"); } } public class BMW523 extends BMW{ public BMW523(){ System.out.println("制造-->BMW523"); } }
工厂类(工厂接口一个,统一工厂;工厂实现类多个,有多少产品就要多少工厂实现)
//工厂接口interface FactoryBMW { BMW createBMW(); } //多个工厂实现,有几个产品就有几个工厂实现public class FactoryBMW320 implements FactoryBMW{ @Override public BMW320 createBMW() { return new BMW320(); } } public class FactoryBMW523 implements FactoryBMW { @Override public BMW523 createBMW() { return new BMW523(); } }
用户使用:
public class Customer { public static void main(String[] args) { //创建特定的工厂实现 FactoryBMW320 factoryBMW320 = new FactoryBMW320(); //用工厂的方法来生产对象 BMW320 bmw320 = factoryBMW320.createBMW(); FactoryBMW523 factoryBMW523 = new FactoryBMW523(); BMW523 bmw523 = factoryBMW523.createBMW(); } }
组装汽车的例子能很好解释工厂方法模式,当创建汽车对象需要创建车轮
、引擎
等时,这个过程我们将其放在工厂方法中实现,我们只需要调用工厂方法即可创建汽车对象。
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。
5. 抽象工厂模式
当为创建一组相关或者相互依赖的对象。
说明:当工厂创建产品时,需要调用多个方法来创建一个产品。这时,工厂方法模式就升级为抽象工厂模式。
产品类
//发动机以及型号 public interface Engine { } public class EngineA extends Engine{ public EngineA(){ System.out.println("制造-->EngineA"); } } public class EngineBextends Engine{ public EngineB(){ System.out.println("制造-->EngineB"); } } //空调以及型号 public interface Aircondition { } public class AirconditionA extends Aircondition{ public AirconditionA(){ System.out.println("制造-->AirconditionA"); } } public class AirconditionB extends Aircondition{ public AirconditionB(){ System.out.println("制造-->AirconditionB"); } }
工厂类
//创建工厂的接口 public interface AbstractFactory { //制造发动机 public Engine createEngine(); //制造空调 public Aircondition createAircondition(); } //为宝马320系列生产配件 public class FactoryBMW320 implements AbstractFactory{ @Override public Engine createEngine() { return new EngineA(); } @Override public Aircondition createAircondition() { return new AirconditionA(); } } //宝马523系列 public class FactoryBMW523 implements AbstractFactory { @Override public Engine createEngine() { return new EngineB(); } @Override public Aircondition createAircondition() { return new AirconditionB(); } }
客户
public class Customer { public static void main(String[] args){ //生产宝马320系列配件 FactoryBMW320 factoryBMW320 = new FactoryBMW320(); factoryBMW320.createEngine(); factoryBMW320.createAircondition(); //生产宝马523系列配件 FactoryBMW523 factoryBMW523 = new FactoryBMW523(); factoryBMW320.createEngine(); factoryBMW320.createAircondition(); } }
6. 工厂模式的小结
主程序从产品接口的具体类中解耦出来,而且程序调用者无须关心产品的实例化过程,主程序仅仅与工厂服务定位结合在一起,可获得所有工厂能产生的实例。
具体类的变化,接口无须发生任何改变,调用者程序代码部分也无须发生任何改动。(用接口的类型接收,多态)
PersonFactory pf = new PersonFactory(); //定义接口Person实例,面向接口编程 Person p = null; //Person是产品的接口,不管是Chinese还是其他人,都用Person接收//使用工厂获得person实例 p = pf.getPerson("chin");
7. 关注下一篇工厂模式模拟Spring的bean加载
- 设计模式------工厂模式
- 设计模式------工厂模式
- 设计模式 [ 工厂模式 ]
- 设计模式--工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 工厂模式
- 设计模式-工厂模式
- 设计模式 -- 工厂模式
- 设计模式-工厂模式
- 设计模式----工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 - 工厂模式
- Eclipse中配置Tomcat服务器
- Redis常用API-使用文档
- 视频剪辑软件大集合
- FILE文件指针相关操作
- Linux学习笔记(2)-Shell基础
- 设计模式--工厂模式
- 遇到的问题 Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:]
- 侧滑,无线轮播,Xlistview
- Wolf and Rabbit
- python—matplotlib数据可视化实例注解系列-----之横条图
- 二叉排序树建立(JAVA实现)
- CentOS7.3 安装及配置Apache 和Tomcat
- RabbitMQ教程之php-amqplib(六)主题
- 一张小图看懂hibernate