您的位置:首页 > 编程语言 > Java开发

Java设计模式之工厂方法模式

2016-06-10 14:02 483 查看

设计模式 - 工厂方法模式

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类

所谓的决定并不是批模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需知道创建的产品是哪一下,选择了使用哪个子类,就决定了实际创建的产品是什么。


工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。

工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。

产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。

产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。

Animal.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  动物抽象类
*/
public abstract class Animal {

//抽象方法
public abstract void get();

}


AnimalFactory.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  创建动物工厂
*/
public interface AnimalFactory {

//得到动物的方法
public abstract Animal createAnimal();

}


Cat.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  动物实例 - 猫
*/
public class Cat extends Animal{

@Override
public void get() {
System.out.println("得到猫");
}

}


CatFactory.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  猫工厂
*/
public class CatFactory implements AnimalFactory {

public Animal createAnimal() {
return new Cat();
}

}


Dog.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  动物实体类 - 狗
*/
public class Dog extends Animal {

@Override
public void get() {
System.out.println("得到狗");
}

}


DogFactory.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  狗工厂
*/
public class DogFactory implements AnimalFactory {

public Animal createAnimal() {
return new Dog();
}

}


Test.java

package com.lxf.factory_MathFactory;

/**
* @address BeiJing
* @author LiXufei
*  测试类
*/
public class Test {

public static void main(String[] args) {

//想要猫
CatFactory catFactory = new CatFactory();
Animal cat = catFactory.createAnimal();
cat.get();

//想要狗
DogFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal();
dog.get();

}

}


输出结果:

得到猫
得到狗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: