一、简单工厂模式(静态工厂模式)
1、简单说明工厂模式:现在所谓的个性化定制就是一个很好的列子,比如你想买一辆与众不同的汽车, 你就去汽车生产厂家说你要什么样的汽车,之后他就会按你的要求给你生产你的车,而你无需关心这个生产过程,这就是工厂模式;
2、简单工厂模式中只有三个角色:工厂,产品抽象,具体产品类;具体产品实现抽象产品,工厂按照传入的产品类名称生产具体实例;工厂中使用java反射进行动态生产对象
3、简单工厂模式中如果不使用java的反射动态生产对象,则你如果要生产另一种汽车,就要修改工厂,而如果使用java的反射动态生成,则你只需要添加具体产品类就可以而不用在修改工厂。
4、简单工厂模式适合于生产产品比较少的 。
二、工厂方法模式
1、这种模式相比简单工厂模式角色有所改变:抽象工厂角色,具体工厂角色,抽象产品角色, 具体产品角色,其中的抽象工厂角色中定义了一个抽象方法,该方法就是一个获取具体产品的抽象方法,当具体工厂实现抽象工厂的时候也就实现了这个获取具体产品的方法,个人感觉如果简单工厂模式使用java反射的话和工厂方法模式在本质上没什么区别,要说有区别就是在简单工厂模式中所有的产品都在工厂中生产,比如苹果,香蕉都由工厂角色生产,而在工厂方法模式中具体的产品由具体的工厂生产,比如苹果由苹果公司生产,香蕉由香蕉公司生产。
三、抽象工厂模式
1、抽象工厂模式是对工厂方法模式的再次扩展这里涉及到的角色有:抽象工厂角色 ,具体工厂角色,产品抽象角色(接口),产品抽象角色(抽象类),产品具体类, 这里的产品想比上面多了一层是因为这里涉及到了一个叫产品族的概念;
2、抽象工厂中定义了一个获取具体产品的抽象方法, 而具体工厂实现这个方法获取具体的产品;
3、产品抽象,就是一类产品的抽象, 而多余的这个抽象类就是实现这个接口,在使用具体类来描述具体的产品信息,就是这里多的这个抽象类实现了产品 族 !!
具体代码如下:
一、简单工厂(静态工厂):
/***
*/
package com.reflect;
/**
*@author WHD
*2014-10-14
*/
public class StaticFactory {
public static void main(String []args) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Apple apple= (Apple) ProductFactory.getProduce("com.reflect.Apple");
Banana banana=(Banana)ProductFactory.getProduce("com.reflect.Baner");
apple.say();
banana.say();
}
}
class ProductFactory{
public static Fruit getProduce(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Fruit f= (Fruit)Class.forName(name).newInstance();
return f;
}
}
interface Fruit{
void say();
}
class Apple implements Fruit{
@Override
public void say() {
System.out.println("i am apple");
}
}
class Banana implements Fruit{
@Override
public void say() {
System.out.println("iam Banana");
}
}
二、工厂方法模式:
/**
*
*/
package com.reflect;
/**
*@author WHD
*2014-10-14
*/
public class MethodFactory {
public static void main(String []args){
AppleFactory appleFactory= new AppleFactory();
BananaFactory bananaFactory= new BananaFactory();
Apples apple= appleFactory.getFruit();
Banana1 banana=bananaFactory.getFruit();
apple.say();
banana.say();
}
}
interface Fruits{
void say();
}
class Apples implements Fruits{
/* (non-Javadoc)
* @see com.reflect.Fruits#say()
*/
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("apple");
}
}
class Banana1 implements Fruits{
/* (non-Javadoc)
* @see com.reflect.Fruits#say()
*/
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("banan");
}
}
interface FruitFactory{
public Fruits getFruit();
}
class AppleFactory implements FruitFactory{
@Override
public Apples getFruit() {
// TODO Auto-generated method stub
return new Apples();
}
}
class BananaFactory implements FruitFactory{
@Override
public Banana1 getFruit() {
// TODO Auto-generated method stub
return new Banana1();
}
}
三、抽象工厂模式:
/**
*
*/
package com.reflect;
/**
*@author WHD
*2014-10-14
*/
public class InteFactory {
public static void main(String []args){
NorthFruitFac nff= new NorthFruitFac();
NorthApple napp=(NorthApple)nff.getApple();
NorthBanana nban=(NorthBanana)nff.getBanana();
napp.get();
nban.get();
}
}
interface Fruit3{
public void get();
}
abstract class AppleFruit implements Fruit3{
@Override
public abstract void get();
}
abstract class BananaFruit implements Fruit3{
@Override
public abstract void get();
}
class SourApple extends AppleFruit{
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("南方苹果");
}
}
class NorthApple extends AppleFruit{
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("北方苹果");
}
}
class SourBanana extends BananaFruit{
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("南方句子");
}
}
class NorthBanana extends BananaFruit{
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("北方句子");
}
}
interface Factory {
AppleFruit getApple();
BananaFruit getBanana();
}
class NorthFruitFac implements Factory {
@Override
public AppleFruit getApple() {
// TODO Auto-generated method stub
return new NorthApple();
}
@Override
public BananaFruit getBanana() {
// TODO Auto-generated method stub
return new NorthBanana();
}
}