设计模式之 工厂模式(Factory)

1.工厂模式的作用

工厂模式封装了对象创建的过程,低程序模块之间的耦合度。

2.工厂模式一般有哪几种

1.普通工厂
2.工厂方法
3.抽象工厂

3.示例代码:

1.所需要的接口和实现类

public interface Animal{
//定义一个接口,之后需要的实体类都将实现该接口

    public abstract void eat();
}

public class Person implements Animal{

    public void eat(){
        System.out.println("我是佩森");
    }
}

public class Dog implements Animal{

    public void eat(){
        System.out.println("我是道格");
    }
}

public class Cat implements Animal{

    public void eat(){
        System.out.println("我是凯特");
    }
}


2.普通工厂类

public class AnimalFactory{
//动物工厂类

    public Animal getAnimal(String typeName) throws Exception{
        if("Person".equals(typeName))
            return new Person();
        else if("Dog".equals(typeName))
            return new Dog();
        else if("Cat".equals(typeName))
            return new Cat();
        else
            throw new Exception("TypeName error");

    }
}

//调用:
public void test(){
    AnimalFactory af = new AnimalFactory();
    try {
        Dog dog = (Dog) af.getAnimal("Dog");
        dog.eat();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

//输出:我是道格
//以上代码可以把getAnimal()设置为静态方法,方便调用
//上面的代码是普通工厂模式,但是有个缺点,假如这个工厂能创建100个不同的实体类,那么逻辑控制就显得十分繁杂,下面的代码是反射版本的,解决了以上问题

public Animal getAnimal(String className) throws Exception {
    return (Animal) Class.forName(className).newInstance();
}

//注意:调用的时候className为该类的全限定名

2.工厂方法

public Animal AnimalFactroyMethod{
    public Animal getDog(){
        return new Dog();
    }

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

    public Animal getPerson(){
        return new Person();
    }
}

//调用方式就是调用类中的方法获得相应实体类对象,这样避免了由于传入参数的错误导致报错
//但是问题又来了,假如我有开始有1个,然而后来我又需要一个方法来提供对象,这样我们只能修改原来的类,这样就违背了开闭原则

3.抽象工厂方法
//为了解决以上问题,我们可以将工厂类抽象出来,每当需要新的类型时候,就创建一个实现该接口的工厂类,代码如下:
//抽象工厂
public interface PublicFactory{
    public Animal produce();
}

//Dog类的工厂
public class DogFactory implements PublicFactory{
    public Animal produce(){
        return new Dog();
    }
}

//其他动物都是这样的,现在我们要添加一个新动物

public class Snake implements Animal{
    public void eat(){
        System.out.println("蛇吃东西");
    }
}

//蛇的工厂类
public class SnakeFactory implements PublicFactory{
    public Animal produce(){
        return new Snake();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值