设计模式之4 工厂模式

工厂模式的核心在于new. 也就是说,不让使用者直接new一个对象。而是通过一个getInstance来得到这个对象。

也就是说,在new的时候,要有权限检查怎么办,有没有这方面的资质?那么对于工厂生成这个对象的时候,不能随便new。


本文word格式下载:


http://wenku.baidu.com/view/f084e9360912a216147929ed.html?st=1


 

1.      单例模式

 

package com.bjsxt.dp.factory;

 

import java.util.ArrayList;

import java.util.List;

 

publicclass Carimplements Moveable{

    //单例模式,定义为private的方法

    privatestatic Carcar =new Car();

   

    //多例模式,就是用一个数组来存放好多car

    //private static List<Car> cars = newArrayList<Car>();

    //构造方法为静态

    private Car(){}

   

    //静态工厂模式

    publicstatic Car getInstance() {

      

       returncar;

    }

   

    publicvoid run() {

       System.out.println("冒着烟奔跑中car.......");

    }

}

 

2.      简单工厂模式

 

有抽象类VehicleFactory

package com.bjsxt.dp.factory;

//交通工具的工厂,相当于一个interface,用来实现多态。

//test当中为了灵活实现。

 

publicabstractclass VehicleFactory {

    //在这里同样定义了create方法,这个方法的返回值是Moveable类型。

    abstract Moveable create();

}

有具体实现类 CarFactoryPlaneFactory

package com.bjsxt.dp.factory;

 

//CarFactory 继承了VehicleFactory抽象类

publicclass CarFactoryextends VehicleFactory{

    public Moveable create() {

       returnnew Car();

    }

}

 

 

package com.bjsxt.dp.factory;

 

//飞机的工厂,用工厂来产生plane

publicclass PlaneFactoryextends VehicleFactory{

    //创建方法

    public Moveable create() {

       //返回一个plane

       returnnew Plane();

    }

}

 

有接口Moveable

package com.bjsxt.dp.factory;

//可以移动的,各种交通工具。

publicinterface Moveable {

    void run();

}

 

 

 

具体的实现car和plane都实现了Moveable接口

package com.bjsxt.dp.factory;

 

import java.util.ArrayList;

import java.util.List;

 

publicclass CarimplementsMoveable{

    //单例模式,定义为private的方法

    publicstatic Carcar =new Car();

   

    //多例模式,就是用一个数组来存放好多car

    //private static List<Car> cars = newArrayList<Car>();

    //构造方法为静态

    public Car(){}

   

    //静态工厂模式

    publicstatic Car getInstance() {

      

       returncar;

    }

   

    publicvoidrun(){

       System.out.println("冒着烟奔跑中car.......");

    }

}

 

package com.bjsxt.dp.factory;

 

publicclass Planeimplements Moveable {

 

    @Override

    publicvoid run() {

       System.out.println("扇着翅膀前进中plane....");

    }

 

}                                                 

 

实现关系为: CarFactoryPlaneFactory都继承自VehicleFactory

car plane都实现了moveable接口。

VehicleFactory当中的create()方法的返回值是moveable

 

在这个例子中,可以控制1.生产过程,2,交通工具的生产。

使用者如下:

package com.bjsxt.dp.factory;

 

publicclass Test {

    publicstaticvoid main(String[] args) {

 

       //通过VehicleFactory父类的引用来指向子类对象。

       VehicleFactoryfactory =new BroomFactory();

       //返回的结果是对应子类的对象,目前为broom.也就是说,new什么就产生什么

       Moveable m = factory.create();

       m.run();

    }

}

 

3.      抽象工厂模式

是简单工厂模式的扩展,就是一口气封装很多项目。在简单工厂模式当中,只封装了一个项目,就是vehicle,而在抽象工厂模式,可以同时封装很多项目,比如本例中,vehicle,food,weapon。

 

 

抽象工厂AbstractFactory

package com.bjsxt.dp.factory.abstractfactory;

 

publicabstractclass AbstractFactory {

    publicabstract Vehicle createVehicle();

    publicabstract Weapon createWeapon();

    publicabstract Food createFood();

   

}

 

第一个工厂,系列1叫DefaultFactory。

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass DefaultFactoryextends AbstractFactory{

 

    @Override

    public Food createFood() {

       //TODO Auto-generatedmethod stub

       returnnew Apple();

    }

 

    @Override

    public Vehicle createVehicle() {

       //TODO Auto-generatedmethod stub

       returnnew Car();

    }

 

    @Override

    public Weapon createWeapon() {

       //TODO Auto-generatedmethod stub

       returnnew AK47();

    }

   

}

 

第二个工厂,系列2叫MagicFactory

 

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass MagicFactoryextends AbstractFactory {

 

    @Override

    public Food createFood() {

       //TODO Auto-generatedmethod stub

       returnnew MushRoom();

    }

 

    @Override

    public Vehicle createVehicle() {

       //TODO Auto-generatedmethod stub

       returnnew Broom();

    }

 

    @Override

    public Weapon createWeapon() {

       //TODO Auto-generatedmethod stub

       returnnew MagicStick();

    }

   

}

 

DefaultFactory和MagicFactory都从AbstractFactory当中继承。

 

 

抽象概念 vehicle, weapon, food:

package com.bjsxt.dp.factory.abstractfactory;

 

publicabstractclass Vehicle {

    publicabstractvoid run();

}

 

package com.bjsxt.dp.factory.abstractfactory;

 

publicabstractclass Weapon {

    publicabstractvoid shoot();

}

 

package com.bjsxt.dp.factory.abstractfactory;

 

publicabstractclass Food {

    publicabstractvoid printName();

}

 

 

系列1实现这些抽象概念:

car对应vehicle:

 

package com.bjsxt.dp.factory.abstractfactory;

 

 

publicclass Carextends Vehicle {

   

   

    publicvoid run() {

       System.out.println("冒着烟奔跑中car.......");

    }

}

 

ak47对应weapon:

 

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass AK47extends Weapon{

    publicvoid shoot() {

       System.out.println("哒哒哒...");

    }

}

 

apple对应food:

 

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass Appleextends Food {

    publicvoid printName() {

       System.out.println("apple");

    }

}

 

 

同样,系列2 也实现这些抽象概念:

broom对应vehicle:

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass Broom extends Vehicle{

 

 

    publicvoid run() {

       System.out.println("一路沙尘暴飞奔而来broom.....");

    }

 

}

 

MagicStick对应weapon:

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass MagicStickextends Weapon {

 

    @Override

    publicvoid shoot() {

       System.out.println("fire hu huhu ...");

    }

 

}

 

MushRoom对应food:

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass MushRoomextends Food {

 

    @Override

    publicvoid printName() {

       //TODO Auto-generatedmethod stub

       System.out.println("mushroom");

    }

 

}

 

那么在使用者:

 

package com.bjsxt.dp.factory.abstractfactory;

 

publicclass Test {

    publicstaticvoid main(String[] args) {

       AbstractFactory f = new DefaultFactory();

       AbstractFactory f = new MagicFactory();

       Vehicle v = f.createVehicle();

       v.run();

       Weapon w = f.createWeapon();

       w.shoot();

       Food a = f.createFood();

       a.printName();

    }

}

只需要替换一条语句,可以替换掉一系列产品。比如本例当中直接把DefaultFactory可以替换到MagicFactory就是非常的方便。

还有一个好处,就是可以自由的添加属于自己的系列产品。比如,产生自己的工厂,然后可以选择vehicle weaponfood,之类的。

 

一个典型的应用,就是换皮肤的软件。

 

工厂的长处和短处:

普通工厂的短处:工厂泛滥。也就是说,工厂类太多了。

 

抽象工厂的短处:没有办法添加新的项目。也就是说本例当中,只有vehicle weaponfood当我需要加入新的项目的时候,要动接口。

 

为了解决这两者的短处,spring提出了BeanFactory

 

4.      模拟spring的beanfactory

new不写在java程序当中,而是去配置文件当中读。

这里比较复杂,回头专门找个贴子来写。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值