设计模式花园(三)-工厂模式

工厂模式

创建一个接口和一系列实现该接口的实体类,然后创建一个工厂类,由传入类型判断实例化哪一个实体类。选择的问题。例如:1)日志记录器。选择哪种存储方式:硬盘、远程服务器等。2)数据库访问,选择哪类数据库进行链接。3)设计一个连接服务器的框架,选择哪种协议进行连接。

Design Garden女主人需要一只猫和一只狗,提高花园温馨度,于是我们设计一个宠物工厂,根据女主人需要创造各类宠物。

Pet接口

public interface Pet {
    public void eat();
}

Dog类

public class Dog implements Pet{
    @Override
    public void eat() {
        System.out.println("dog eat bone.");
    }
}

Cat类

public class Cat implements Pet{
    @Override
    public void eat() {
        System.out.println("cat eat fish.");
    }
}

PetFactory类

public class PetFactory {
    public Pet getPet(String petType) {
        if (petType == null) {
            return null;
        }
        else if (petType.equalsIgnoreCase("DOG")) {
            return new Dog();
        }
        else if (petType.equalsIgnoreCase("CAT")) {
            return new Cat();
        }
        return null;
    }
}

测试工厂模式

public class TestFactory {
    public static void main(String[] args) {
        PetFactory petFactory = new PetFactory();
        Pet pet = petFactory.getPet("Dog");
        pet.eat();
    }
}
抽象工程模式

创建一个抽象工厂类和工厂生产类,根据传入字符串类型判断使用哪种工厂对象,然后工厂类传入字符串类型判断创建哪个类。

Design Garden女主人需要一只猫和一只狗和一些小孩子的玩具,提高花园温馨度和欢乐度,于是我们设计一个抽象工厂,根据需要创建宠物工厂和玩具工厂,然后两个工厂可以根据女主人需要创造各类宠物和玩具。

AbstractFactory抽象工程类

public abstract class AbstractFactory {
    public abstract Pet getPet(String petType);
    public abstract Toy getToy(String toyType);
}

FactoryProducer工厂生产类,根据传入字符串决定所创建的工厂类

public class FactoryProducer {
    public static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("PET")) {
            return new PetFactory();
        } else if (choice.equalsIgnoreCase("TOY")) {
            return new ToyFactory();
        }
        return null;
    }
}

PetFactory宠物工厂

public class PetFactory extends AbstractFactory{

    @Override
    public Pet getPet(String petType) {
        if (petType == null) {
            return null;
        }
        if (petType.equalsIgnoreCase("CAT")) {
            return new Cat();
        }
        return null;
    }

    @Override
    public Toy getToy(String toyType) {
        return null;
    }
}

ToyFactory玩具工厂

public class ToyFactory extends AbstractFactory{
    @Override
    public Pet getPet(String petType) {
        return null;
    }

    @Override
    public Toy getToy(String toyType) {
        if (toyType == null) {
            return null;
        }
        if (toyType.equalsIgnoreCase("TANK")) {
            return new Tank();
        }
        return null;
    }
}

宠物接口

public interface Pet {
    public void eat();
}

猫类,实现宠物接口

public class Cat implements Pet{
    @Override
    public void eat() {
        System.out.println("cat eat fish");
    }
}

玩具接口

public interface Toy {
    public void makeSound ();
}

坦克类,实现玩具接口

public class Tank implements Toy{
    @Override
    public void makeSound() {
        System.out.println("shut tong~~");
    }
}

测试抽象工程

public class TestAbstractFactory {
    public static void main(String[] args) {
        AbstractFactory petFactory = FactoryProducer.getFactory("PET");
        Pet cat = petFactory.getPet("CAT");
        cat.eat();

        AbstractFactory toyFactory = FactoryProducer.getFactory("TOY");
        Toy toy = toyFactory.getToy("TANK");
        toy.makeSound();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值