设计模式之工厂模式【内附对象实例化几种方式】

嗯,最近复习一下常用的设计模式,顺便巩固一下java技术基础。文章里都是个人的一些见解,官方的解释就不放了,网上一大堆。

一、什么是工厂模式

工厂模式,最简单的一种设计模块,也很好的体现了面向对象编程的思想。

个人理解:其实就是将同一类型的事物抽象出来,当成一个工厂来处理,只要是这种类型的事物,都可以从这个工厂里获取。

解决问题:不用在代码里到处实例化对象,更好的去统一分类管理同一类型的类。

二、demo演示

比如现在需要用到一系列的动物,但是当前只需要用到Dog、Cat这2个,以后还会有各种动物的接入使用,为了解决在使用某个动物时,不用到处去new实例,并且实现统一的管理,我们就可以使用工厂模式来设计。

1.将事物进行分类,抽象出事物的统一分类标准,这里就是动物(Animal),而且Animal是暂时不能定义其具体行为和属性的,所以用接口进行定义。假设都可以动物有名字、颜色、年龄

public interface Animal {

    public void getName();

    public void getColor();

    public void getAge();
}

2.当前需要用的是Dog和Cat,定义Dog、Cat并实现该接口

Dog:

public class Dog implements Animal{
    @Override
    public void getName() {
        System.out.println("my name is Dog");
    }

    @Override
    public void getColor() {

    }

    @Override
    public void getAge() {

    }
}

Cat:

public class Cat implements Animal {

    @Override
    public void getName() {
    System.out.println("my name is Cat");
    }

    @Override
    public void getColor() {

    }

    @Override
    public void getAge() {

    }
}

3.建立一个动物工厂,专门提供各种动物的对象【2种实例化对象的方式】。

*实例化对象的4种方式:

①通过构造函数new对象,

②通过Class.forName以及newInstance反射实例对象

③通过调用对象的clone(),克隆对象

④通过IO流,将对象输出到到本地,再从本地读取对象的数据结构

public class  AnimalFactory {

    private static String classCatName="com.cheng.designpattern.factory_model.Cat";
    private static String classDogName="com.cheng.designpattern.factory_model.Dog";

    //普通new实例化
    public static Animal getAnimalUseNew(String animalType){
        if(animalType.equalsIgnoreCase("Cat")){
            return new Cat();
        }
        else if (animalType.equalsIgnoreCase("Dog")){
            return new Dog();
        }else{
            return null;
        }
    }

    //反射实例化
    public static Animal getAnimalUseDynamic(String animalType) {
        if(animalType.equalsIgnoreCase("Cat")){

            try{
                Class c=Class.forName(classCatName);
                Cat people=(Cat) c.newInstance();
                return people;
            }catch (Exception e){
                return null;
            }

        }
        else if (animalType.equalsIgnoreCase("Dog")){
            try{
                Class c=Class.forName(classDogName);
                Dog dag=(Dog) c.newInstance();
                return dag;
            }catch (Exception e){
                return null;
            }
        }else{
            return null;
        }
    }

}

4.写个测试类


public class Test {
    public static void main(String[] args) {


        Animal people=AnimalFactory.getAnimalUseNew("Cat");
        people.getName();

        Animal dog=AnimalFactory.getAnimalUseNew("Dog");
        dog.getName();

        Animal people1=AnimalFactory.getAnimalUseDynamic("Cat");
        people1.getName();

        Animal dog1=AnimalFactory.getAnimalUseDynamic("Dog");
        dog1.getName();
    }
}

后台打印结果:

到此,最简单的工厂模式demo就演示完了,如有错漏请告知。

猜你喜欢

转载自blog.csdn.net/Ouyzc/article/details/83508052
今日推荐