【设计模式】工厂模式

来源:互联网 发布: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类图













0 0
原创粉丝点击