23模式之: 静态工厂模式demo

动物类型及子类型:

package simple_factory_mode;

/**
 * 动物类型
 */
public interface Animal {
    
    /**
     * 发声
     */
    void say();
    
}


/**
 * 猫
 */
class Cat implements Animal {

    @Override
    public void say() {
        System.out.println("喵喵!");
    }
    
}


/**
 * 狗
 */
class Dog implements Animal {

    @Override
    public void say() {
        System.out.println("旺旺!");
    }
    
}

 

动物工厂类:

package simple_factory_mode;

/**
 * 动物工厂类
 * 简单(静态)工厂模式有小问题, 一但增加新产品(如羊),
 * 需要修改已有代码, 违反开闭原则, 但却是用的最多的
 */
public class AnimalFactory {

    
    /**
     * 方式1: 创建动物(传入类型)
     */
    public static Animal createAnimal(String type){
        if ("猫".equals(type)) {//可以用反射的方式替换字串
            return new Cat();
        }
        if ("狗".equals(type)) {
            return new Dog();
        }
        //如果有新类型需要修改已有代码
        return null;
    }
    
    
    /**
     * 方式2: 创建猫
     */
    public static Animal createCat(){
        return new Cat();
    }
    
    
    /**
     * 方式2: 创建狗
     */
    public static Animal createDog(){
        return new Dog();
    }
    
}

 

类图:

 

测试类:

package simple_factory_mode;

public class Client {

    public static void main(String[] args) {
        //直接创建, 客户需要知道具体类型
        Animal c1 = new Cat();
        Animal d1 = new Dog();
        c1.say();
        d1.say();
        
        
        //方式1: 利用工厂, 客户告诉它我需要什么样类型的对象
        //与具体怎样创建工作分离, 符合单一职责, 最少知道原则
        Animal c2 = AnimalFactory.createAnimal("猫");
        Animal d2 = AnimalFactory.createAnimal("狗");
        c2.say();
        d2.say();
        
        
        //方式2
        Animal c3 = AnimalFactory.createCat();
        Animal d3 = AnimalFactory.createDog();
        c3.say();
        d3.say();
    }
    
}

 

打印结果:

喵喵!
旺旺!
喵喵!
旺旺!
喵喵!
旺旺!

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7127353.html

 

转载于:https://www.cnblogs.com/gscq073240/articles/7127353.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值