设计模式--抽象工厂

深入理解 JVM 原理
深入理解 JVM 原理
wangxiaoming

设计模式--抽象工厂


抽象工厂的特点是产品不只一个,例如,这个工厂中可生产 食物 ,武器,交通工具

在抽象工厂中,可以 有产品A接口 ,产品B接口,产品C接口 等等。。。

具体看抽通过实例看抽象工厂的优势


1、首先声明一个抽象工厂:

public abstract class AbstractFactory {
	public abstract Vechile  createVechile();
	public abstract Weapon createWeapon();
	public abstract Food creatFood();
	 
}

里面包过三个产品 交通工具,武器 和食物

其次看三个接口:

public abstract class Vechile {
	public abstract void run();
}

交通工具有一个方法run;

public abstract class Weapon {
	public abstract void shoot();
}

武器中有一个方法 shoot

public abstract class Food {
    public abstract  void printName();
}

食物有一个抽象方法 printName()

 

2、抽象工厂的实现:

声明一个默认工厂和一个魔法工厂

public class DefaultFactory extends AbstractFactory {
  /*  public Car createCar(){
    	return new Car();
    }
    
    public AK47 createAk47(){
    	return new AK47();
    }
    
    public Apple creaApple(){
    	return new Apple();
    }
*/
	@Override
	public Vechile createVechile() {
		// TODO Auto-generated method stub
		return new Car();
	}

	@Override
	public Weapon createWeapon() {
		// TODO Auto-generated method stub
		return new AK47();
	}

	@Override
	public Food creatFood() {
		// TODO Auto-generated method stub
		return new Apple();
	}
}

声明一个魔法工厂:

public class MagicFactory extends AbstractFactory{
  /* public Broom createBroom(){
	   return new Broom();
   }
   
   public MagicStick CreateMagicStick(){
	   return new MagicStick();
   }
   
   public Mushroom createFood(){
	   return new Mushroom();
   }*/

	@Override
	public Vechile createVechile() {
		// TODO Auto-generated method stub
		return new Broom();
	}

	@Override
	public Weapon createWeapon() {
		// TODO Auto-generated method stub
		return new MagicStick();
	}

	@Override
	public Food creatFood() {
		// TODO Auto-generated method stub
		return new Mushroom();
	}
}


默认工厂和魔法工厂返回的产品各部一样

默认工厂的产品有三个:

交通工具:

public class Car extends Vechile {
	public void run() {
		System.out.println("run run run");
	}

}

武器:

public class AK47 extends Weapon{
   @Override
   public void shoot(){
	   System.out.println("da da da ...");
   }
   
}

食物:

public abstract class Food {
    public abstract  void printName();
}

魔法工厂的产品有三个:

交通工具扫把:

public class Broom extends Vechile {
   public void run(){
	   System.out.println("hu hu hu hu run");
   }
}

武器 魔棒:

public class MagicStick extends Weapon{

	@Override
	public void shoot() {
		// TODO Auto-generated method stub
		System.out.println("huhu hu fire");
	}

}


食物 蘑菇:

public class Mushroom extends Food{

	@Override
	public void printName() {
		System.out.println("I am a mogu");
	}

}


测试:

public class Test {

	public static void main(String[] args) {
 
	 /*  String s1 = "Monday";
	   //==和equals 的区别
	   String s2 = new String("Monday");
	   if(s1 == s2)
	   {
		   System.out.println("s1 ==s2");
	   }
	   else
	   {
		   System.out.println("�����");
	   }
	  
	   System.out.println("Hello World!");*/
		// 抽象工厂模式
		// 能否有工厂产生这一系列产品
		/*Car car = new Car();
		car.run();
		AK47 k =  new AK47();
		k.shhoot();
		Apple a = new Apple();
		a.printName();*/
		
		
		/**
		 * 抽象工厂模式  可以修改成AbstractFactory 然后里面一系列产品都变了
		 * 甚至最后写在配置文件里面,整个都变了
		 */
		//AbstractFactory f = new DefaultFactory();

		AbstractFactory f = new MagicFactory();
		Vechile c = f.createVechile();
		c.run();
		Weapon k = f.createWeapon();
		k.shoot();
		Food a = f.creatFood();
		a.printName();

	}

}


看测试类,下次要生成不同的工厂只需要修改:

AbstractFactory f = new DefaultFactory();

这个换成:

AbstractFactory f = new MagicFactory();

其他的代码不用改动,生产的产品是完全不一样的,甚至把defaultFactory , MagicFactory 都写在配置文件中加载后,结果也是不一样的。就省了写很多代码了


wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值