【设计模式】工厂模式
来源:互联网 发布:linux 登录日志查询 编辑:程序博客网 时间:2024/06/02 02:32
【设计模式】工厂模式
1.工厂模式的引入
我们通常创建一个对象的时候直接new,但是我们要对对象创建的过程加以控制的时候,我们就需要封装创建对象的代码部分。因为创建对象部分的代码有时候需求会发生变化。可以想办法隔离掉以后变化的部分。抽离或封装不影响其他部分把创建对象的代码(抽离出来)移动到另一个对象中,由这个新对象专职创建对象。我们称这个新对象为工厂。这样一来我们把对象创建的过程包装进一个类中,当以后实现改变时,只需要修改这个类即可。
2.简单工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。可以理解为是不同工厂模式的一个特殊实现。
如果要扩展,需要修改代码。
简单工厂的UML类图
简单工厂的实例代码
产品类型:Moveable
package com.factory; public interface Moveable {void run ();}具体的产品有三类Car、Plane、Broom
Car
package com.simpleFactory; public class Car implements Moveable {public void run(){System.out.println("冒烟奔跑的车");}}Plane
package com.simpleFactory; public class Plane implements Moveable {@Overridepublic void run() {System.out.println("扇着翅膀前进中");}}Broom
package com.simpleFactory; public class Broom implements Moveable {public void run(){System.out.println("呼呼呼...");}}简单工厂SimpleFactory
package com.simpleFactory; public class SimpleFactory {public Moveable create (String type){if(type.equals("flight")){return new Plane();}else if (type.equals("flightless")){return new Car();}else{return new Broom();}}}测试类Client
package com.simpleFactory; public class Client {public static void main(String[] args) {SimpleFactory factory = new SimpleFactory();Moveable m = factory.create("flight");m.run();}}简单工厂例子的类图
3.工厂方法
针对每一种产品提供一个工厂类,通过不同的工厂实例来支持创建不同的产品实例,在同一等级结构中
支持增加任意产品。我们可以在产品这个维度进行扩展,我们可以产生新的产品,我们可以产生新的工厂。
缺点是:如果产生产品系列(种类)会比较麻烦,导致工厂泛滥。
工厂方法UML类图
具体的例子:产品类型Moveable
package com.factory;public interface Moveable {void run ();}具体的产品Car、Plane
Car
package com.factory;public class Plane implements Moveable {@Overridepublic void run() {System.out.println("扇着翅膀前进中");}}
Plane
package com.factory;public class Car implements Moveable {public void run(){System.out.println("冒烟奔跑的车");}}
工厂方法
package com.factory;public abstract class VehicleFactory {//产生交通工具的工厂abstract Moveable create();}具体的工厂:CarFactory、PlaneFactory
CarFactory
package com.factory;public class CarFactory extends VehicleFactory {Moveable create() {return new Car();}}PlaneFactory
package com.factory;public class PlaneFactory extends VehicleFactory {public Moveable create(){return new Plane();}}Client
package com.factory;public class Client {public static void main (String [] args){VehicleFactory factory = new PlaneFactory();Moveable m = factory.create();m.run();}}
如果要是想创建Car,直接将PlaneFactory替换成CarFactory即可,其他部分代码不需要修改,如果用配置文件代替这一部分,则就不需要修改代码,直接修改配置文件即可,如Spring。
针对上例的UML类图:
4.抽象工厂
产生一系列产品如果你想替换一系列产品的时候,你需要将这些产品造出来,对应的工厂造出来,换掉对应的工厂就可以了。
缺点是,可以产生新的产品系列,但不能产生新的产品种类,要改动的地方会太多。抽象工厂是应对产品族概念的。
比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
UML类图
具体案例:Vehicle、Weapon、Food定义三种类型产品
Vehicle
package com.abstractFactory;public abstract class Vehicle {public abstract void run();}
Weapon
package com.abstractFactory;public abstract class Weapon {public abstract void shoot();}Food
package com.abstractFactory;public abstract class Food {public abstract void printName();}AbstractFactory
package com.abstractFactory;public abstract class AbstractFactory {public abstract Vehicle createVehicle();public abstract Weapon createWeapon();public abstract Food createFood();}
三种类型产品的具体产品类型:Car、AK47、Apple和Broom、MagicStick、MushRoom
Car
package com.abstractFactory;public class Car extends Vehicle {public void run() {System.out.println("冒着烟奔跑中car.......");}}
Broom
package com.abstractFactory;public class Broom extends Vehicle{public void run() {System.out.println("一路沙尘暴飞奔而来broom.....");}}AK47
package com.abstractFactory;public class AK47 extends Weapon{public void shoot() {System.out.println("哒哒哒...");}}
MagicStick
package com.abstractFactory;public class MagicStick extends Weapon {@Overridepublic void shoot() {System.out.println("fire hu hu hu ...");}}
Apple
package com.abstractFactory;public class Apple extends Food {public void printName() {System.out.println("apple");}}
MushRoom
package com.abstractFactory;public class MushRoom extends Food {@Overridepublic void printName() {// TODO Auto-generated method stubSystem.out.println("mushroom");}}
定义的两种工厂:DefaultFactory、MagicFactory
DefaultFactory
package com.abstractFactory;public class DefaultFactory extends AbstractFactory{@Overridepublic Food createFood() {return new Apple();}@Overridepublic Vehicle createVehicle() {return new Car();}@Overridepublic Weapon createWeapon() {return new AK47();}}MagicStick
package com.abstractFactory;public class MagicFactory extends AbstractFactory {@Overridepublic Food createFood() {return new MushRoom();}@Overridepublic Vehicle createVehicle() {return new Broom();}@Overridepublic Weapon createWeapon() {return new MagicStick();}}
Client
package com.abstractFactory;public class Client {public static void main(String[] args) {AbstractFactory f = new DefaultFactory();Vehicle v = f.createVehicle();v.run();Weapon w = f.createWeapon();w.shoot();Food a = f.createFood();a.printName();}}
如果更换一系列的产品,我们只需要将上面的DefaultFactory更换成MagicFactory即可,其他部分不需要改变。
以上例子的UML类图
- 设计模式------工厂模式
- 设计模式------工厂模式
- 设计模式 [ 工厂模式 ]
- 设计模式--工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 工厂模式
- 设计模式-工厂模式
- 设计模式 -- 工厂模式
- 设计模式-工厂模式
- 设计模式----工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 - 工厂模式
- SSH Access Denied
- ARM的流水线与PC值的关系
- 第十六周项目2—阅读程序(3)
- C#托管代码调用C++非托管代码
- set集合最经典的编程题型
- 【设计模式】工厂模式
- 刘未鹏逃出肖申克系列链接
- 第十二周项目:复数类
- ORACLE批量编译无效对象
- Android MediaPlayer各种状态切换
- group by与distinct有何区别
- c++一般规定,编译器自行构造的临时对象一定是const的
- C++拷贝构造函数详解
- gulp hot deploy 前端项目