java抽象工厂设计模式_Java设计模式笔记之抽象工厂代码示例

本文介绍了Java中的抽象工厂模式,它是工厂模式的一种扩展,通过创建抽象工厂来生产不同类型的工厂,这些工厂能生产具体的产品。文中以博客换肤系统为例,展示了如何运用抽象工厂模式实现不同风格的产品,如黑色主题和白色主题,并创建了水果和蔬菜的工厂,这些工厂都继承自一个抽象的种植物工厂。最后,通过工厂生产器动态地获取和创建所需的工厂实例。代码示例展示了如何在实际编程中应用抽象工厂模式。
摘要由CSDN通过智能技术生成

上一篇说到了工厂模式,那么学习了工厂模式,抽象工厂也得学习一下。实际上,抽象工厂模式实际上就是在工厂模式的基础上再嵌套一层工厂模式而已,通过父工厂制造子工厂。只是,也并不完全是嵌套一层,各个工厂会被抽象成一个集多个工厂共同点的抽象类。通过工厂制造器,创建出该抽象工厂的子类。

好比如说,一个博客页面有个换肤系统。那么假如有两套风格,黑和白。那么,我选择了黑色风格的,实际这步就相当通过换肤系统这个工厂制造器,创建出一个黑色主题的工厂,该黑色主题的工厂内可以生产各种黑色风格的产品,比如黑色头像挂饰,黑色背景,黑色的xxx等,然后通过这些黑色主题产品完成了整个换肤操作。白色主题也如此。

好吧,上次以水果工厂作为一个类,那么这次要创建一个蔬菜工厂,水果和蔬菜这两类都属于种植物,那么我们就可以根据这一共同点抽象出一个种植物抽象类,即种植物工厂。

首先,创建产品类,包括上次的水果,和现在的蔬菜,他们都实现了水果类接口和蔬菜类接口:

水果系列:

public interface Fruit {

void printInfo();

}

public class Apple implements Fruit{

@Override

public void printInfo() {

// TODO Auto-generated method stub

System.out.println("苹果");

}

}

public class Banana implements Fruit{

@Override

public void printInfo() {

// TODO Auto-generated method stub

System.out.println("香蕉");

}

}

public class Orange implements Fruit{

@Override

public void printInfo() {

// TODO Auto-generated method stub

System.out.println("橙子");

}

}

接着是蔬菜系列:

public interface Vegetable {

public void printInfo();

}

public class Tomato implements Vegetable{

@Override

public void printInfo() {

// TODO Auto-generated method stub

System.out.println("西红柿");

}

}

public class Cabbage implements Vegetable{

@Override

public void printInfo() {

// TODO Auto-generated method stub

System.out.println("白菜");

}

}

public class Eggplant implements Vegetable{

@Override

public void printInfo() {

// TODO Auto-generated method stub

System.out.println("茄子");

}

}

然后,是它们各自的工厂类:

水果工厂:

public class FruitFactory extends PlantFactory{

public static final int APPLE=1;

public static final int BANANA=2;

public static final int ORANGE=3;

@Override

public Fruit getFruit(int fruitType){

if(fruitType==APPLE){

return new Apple();

}

if(fruitType==BANANA){

return new Banana();

}

if(fruitType==ORANGE){

return new Orange();

}

return null;

}

@Override

Vegetable getVegetable(int vegetableType) {

// TODO Auto-generated method stub

return null;

}

}

蔬菜工厂:

public class VegetableFactory extends PlantFactory {

public static final int CABBAGE=1;

public static final int TOMATO=2;

public static final int EGGPLANT=3;

@Override

Fruit getFruit(int fruitType) {

// TODO Auto-generated method stub

return null;

}

@Override

public Vegetable getVegetable(int vegetableType) {

// TODO Auto-generated method stub

if(vegetableType==CABBAGE){

return new Cabbage();

}

if(vegetableType==TOMATO){

return new Tomato();

}

if(vegetableType==EGGPLANT){

return new Eggplant();

}

return null;

}

}

可以看到,它们都是属于种植物这一类,所以都是继承了种植工厂类

public abstract class PlantFactory {

abstract Fruit getFruit(int fruitType);

abstract Vegetable getVegetable(int vegetableType);

}

最后,提供一个工厂生产器,即生产工厂的工厂:

public class Plantation {

public static final int FRUIT=1;

public static final int VEGETABLE=2;

public static PlantFactory getFactory(int factoryType){

if(factoryType==FRUIT){

return new FruitFactory();

}

if(factoryType==VEGETABLE){

return new VegetableFactory();

}

return null;

}

}

好吧,写个main测试下:

public static void main(String[] args) {

// TODO Auto-generated method stub

FruitFactory fruitFactory=(FruitFactory)Plantation.getFactory(Plantation.FRUIT);

Apple apple=(Apple) fruitFactory.getFruit(FruitFactory.APPLE);

apple.printInfo();

VegetableFactory vegetableFactory=(VegetableFactory)Plantation.getFactory(Plantation.VEGETABLE);

Tomato tomato=(Tomato) vegetableFactory.getVegetable(VegetableFactory.TOMATO);

tomato.printInfo();

}

结果:

苹果

西红柿

虽然工厂设计模式在获取产品类时很方便,但实际上产品的需求越严格,那么内部系统则越发庞大复杂,对于生产一些小产品来说,使用这么复杂庞大的系统反而浪费资源。

总结

以上就是本文关于Java设计模式笔记之抽象工厂代码示例的全部内容。代码是一个人主观意志的客观反映。。。胡扯了,参考别人写的代码,另外,多看看源码也是有好处的,学习别人实现某个功能的设计思路,来提高自己的编程水平。欢迎参阅:Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解、Java单例模式实现静态内部类方法示例等,有什么问题可以随时留言,欢迎大家交流讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值