设计模式第三讲:抽象工厂

来源:互联网 发布:如何学好ps软件 编辑:程序博客网 时间:2024/04/28 14:01

抽象工厂

一.模式定义:

    

为创建一系列的相关或者依赖的对象提供一个接口,而且无需指定他们的具体类。

二.模式特点:

是工厂方法的升级版,在涉及要创建多个相关的类对象时,是很好的解决方案。

三.使用场景:

在工厂方法的基础上,还需要创建多个相关或依赖的类时(比如产生具有性别的动物),可以使用。

四.具体实现:

1.定义基本类:这里以具有性别的动物为例子,Animal这个父类在上一章工厂方法中有提及。

//要生产雄性动物的基本抽象类public abstract class MaleAnimal extends Animal{//动物的名称public abstract String name();//动物的叫声public abstract String sound();//动物的性别public  String sex(){return "性别为:公的";};}

//要生产雌性动物的基本抽象类public abstract class FemaleAnimal extends Animal{//动物的名称public abstract String name();//动物的叫声public abstract String sound();//动物的性别public  String sex(){return "性别为:母的";};}

2.定义具体类,这里以猫狗为例子。

//具体的动物public class MaleCat extends MaleAnimal{@Overridepublic String name() {// TODO Auto-generated method stubreturn "猫";}@Overridepublic String sound() {// TODO Auto-generated method stubreturn "叫:喵喵";}}

//具体的动物public class MaleDog extends MaleAnimal{@Overridepublic String name() {// TODO Auto-generated method stubreturn "狗";}@Overridepublic String sound() {// TODO Auto-generated method stubreturn "叫:汪汪";}}

//具体的动物public class FemaleCat extends FemaleAnimal{@Overridepublic String name() {// TODO Auto-generated method stubreturn "猫";}@Overridepublic String sound() {// TODO Auto-generated method stubreturn "叫:喵喵";}}

//具体的动物public class FemaleDog extends FemaleAnimal{@Overridepublic String name() {// TODO Auto-generated method stubreturn "狗";}@Overridepublic String sound() {// TODO Auto-generated method stubreturn "叫:汪汪";}}

3.定义抽象工厂类。

//抽象工厂的定义public abstract class AnimalFactory {public abstract  Animal getAnimal(Class c);}

4.定义具体工厂类,由于动物具有两种性别,所以创建两种工厂。

//雄性动物工厂的定义public class MaleAnimalFactory extends AnimalFactory{public  MaleAnimal getAnimal(Class c){MaleAnimal maleAnimal = null;try {maleAnimal = (MaleAnimal)Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("必须指定动物类型");} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("动物定义错误");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("找不到你需要的动物");}return maleAnimal;}}

//工厂的定义public class FemaleAnimalFactory extends AnimalFactory{public  FemaleAnimal getAnimal(Class c){FemaleAnimal femaleAnimal = null;try {femaleAnimal = (FemaleAnimal)Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("必须指定动物类型");} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("动物定义错误");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("找不到你需要的动物");}return femaleAnimal;}}

5.使用实例。

public class main {public static void main(String[] args){MaleAnimalFactory factory1 = new MaleAnimalFactory();//工厂生产出一只公狗MaleAnimal dog = factory1.getAnimal(MaleDog.class);System.out.println(dog.sex()+dog.name()+dog.sound());//工厂生产出一只公猫MaleAnimal cat = factory1.getAnimal(MaleCat.class);System.out.println(cat.sex()+cat.name()+cat.sound());FemaleAnimalFactory factory2 = new FemaleAnimalFactory();//工厂生产出一只母狗FemaleAnimal dog2 = factory2.getAnimal(FemaleDog.class);System.out.println(dog2.sex()+dog2.name()+dog2.sound());//工厂生产出一只母猫FemaleAnimal cat2 = factory2.getAnimal(FemaleCat.class);System.out.println(cat2.sex()+cat2.name()+cat2.sound());}}







0 0
原创粉丝点击