设计模式抽象工厂的代码讲解

代码背景

工厂生产小球和对应的盒子,材质有两种,皮质的和钢制的

先写两种材质的小球

框架结构1

MagicPipe是管理工厂的类

package abstractMethod;
public abstract class AbstractFactory {
 public abstract Ball MakeBallFactoryMethod();
}
package abstractMethod;
//管理工厂
public  class MagicPipe {
// uml聚集 包含抽象工厂对象
 public AbstractFactory abstractFactory;
// 传入某一个具体工厂 得到的是产品系列
 public void setAbstractFactory(AbstractFactory abstractFactory) {
  this.abstractFactory = abstractFactory;
 }
// 公有接口
 public Ball pop(){
  System.out.println("准备创建中……");
  return abstractFactory.MakeBallFactoryMethod();
 }
}
package abstractMethod;
public class RubberBallFactory extends AbstractFactory{
 public Ball MakeBallFactoryMethod() {
  return new RubberBall();
 }
}
package abstractMethod;
public class SteelBallFactory extends AbstractFactory{
 public Ball MakeBallFactoryMethod() {
  return new SteelBall();
 }
}
package abstractMethod;
public abstract class Ball {
 public abstract void prtInfo();
}
package abstractMethod;
public class SteelBall extends Ball{
 public SteelBall() {
  System.out.println("创建了钢球");
 }
 public void prtInfo(){
  System.out.println("我是钢球");
 }
}
package abstractMethod;
public class RubberBall extends Ball{
 public RubberBall() {
  System.out.println("创建了皮球");
 }
 public void prtInfo(){
  System.out.println("我是皮球");
 }
}
package abstractMethod;
public class Application {
public static void main(String[] args) {
 System.out.println("欢迎进入坦克,请按下F键");
 //创建皮球
 MagicPipe mp = new MagicPipe();
 mp.setAbstractFactory(new RubberBallFactory());
 Ball b = mp.pop();
 b.prtInfo();
}
}

添加盒子的元素

框架结构2

上面的代码时建立一个抽象工厂,可以创建两种材质的小球
接下来加入盒子的元素:

	有一个抽象工厂生产小球和盒子
	分别被 皮质厂 和 钢质厂 继承
	皮质厂负责生产皮盒子和皮球
	钢质厂负责生产钢盒子和钢球
package abstractMethod_Series;
public abstract class AbstractFactory {
 public abstract Ball MakeBallFactoryMethod();
 public abstract Box MakeBoxFactoryMethod();
}
package abstractMethod_Series;
public class RubberStyleFactory extends AbstractFactory{ 
 public Ball MakeBallFactoryMethod() {
  return new RubberBall();
 }
 public Box MakeBoxFactoryMethod() {
  return new RubberBox();
 }
}
package abstractMethod_Series;
public class SteelStyleFactory extends AbstractFactory{
 public Ball MakeBallFactoryMethod() {
  return new SteelBall();
 }
 @Override
 public Box MakeBoxFactoryMethod() {
  // TODO Auto-generated method stub
  return new SteelBox();
 }
}

MagicPipe是管理工厂的类

package abstractMethod_Series;
//管理工厂
public  class MagicPipe {
// uml聚集 包含抽象工厂对象
 public AbstractFactory abstractFactory;
// 传入某一个具体工厂 得到的是产品系列
 public void setAbstractFactory(AbstractFactory abstractFactory) {
  this.abstractFactory = abstractFactory;
 }
// 公有接口
 public Ball pop(){
  System.out.println("准备创建中……");
  return abstractFactory.MakeBallFactoryMethod();
 }
 public Box popBox(){
  System.out.println("准备创建中……");
  return abstractFactory.MakeBoxFactoryMethod();
 }
}
package abstractMethod_Series;
public abstract class Ball {
 public abstract void prtInfo();
}
package abstractMethod_Series;
public abstract class Box {
 public abstract void prtInfo();
}
package abstractMethod_Series;
public class RubberBall extends Ball{
 public RubberBall() {
  System.out.println("创建了皮球");
 }
 public void prtInfo(){
  System.out.println("我是皮球");
 }
}
package abstractMethod_Series;
public class RubberBox extends Box {
 public RubberBox() {
  System.out.println("创建了皮盒子");
 }
 public void prtInfo(){
  System.out.println("我是皮盒子");
 }
}
package abstractMethod_Series;
public class SteelBall extends Ball{
 public SteelBall() {
  System.out.println("创建了钢球");
 }
 public void prtInfo(){
  System.out.println("我是钢球");
 }
}
package abstractMethod_Series;
public class SteelBox extends Box {
 public SteelBox() {
  System.out.println("创建了钢盒子");
 }
 public void prtInfo(){
  System.out.println("我是钢盒子");
 }
}
package abstractMethod_Series;
public class Application {
public static void main(String[] args) {
 System.out.println("欢迎进入坦克,请按下F键");
 
 //创建皮球 /皮盒子
 MagicPipe mp = new MagicPipe();
 mp.setAbstractFactory(new RubberStyleFactory());
 Ball ball;
 Box box;
 ball = mp.pop();
 ball.prtInfo();
 box = mp.popBox();
 box.prtInfo();
 
 //创建钢球 /钢盒子
 mp.setAbstractFactory(new SteelStyleFactory());
 ball = mp.pop();
 ball.prtInfo();
 box = mp.popBox();
 box.prtInfo();
}
}

再将耦合到一起的工厂分开,建立子工厂

框架结构3

建立抽象的盒子工厂和小球工厂

小球工厂被皮球工厂和钢球工厂继承

盒子工厂被皮盒子工厂和钢盒子工厂继承

每个工厂生产一个产品,可以有更灵活的组合搭配

package abstractMethod_Series_level4;
// 小球的抽象工厂
public abstract class AbstractFactory1 {
 public abstract Ball MakeBallFactoryMethod();
}
package abstractMethod_Series_level4;
public class RubberBallFactory extends AbstractFactory1{
 public Ball MakeBallFactoryMethod() {
  return new RubberBall();
 }
}
package abstractMethod_Series_level4;
public class SteelBallFactory extends AbstractFactory1{
 public Ball MakeBallFactoryMethod() {
  return new SteelBall();
 }
}
package abstractMethod_Series_level4;
// 盒子的抽象工厂
public abstract class AbstractFactory2 {
 public abstract Box MakeBoxFactoryMethod();
}
package abstractMethod_Series_level4;
public class RubberBoxFactory extends AbstractFactory2{
 @Override
 public Box MakeBoxFactoryMethod() {
  // TODO Auto-generated method stub
  return new RubberBox();
 }
}
package abstractMethod_Series_level4;
public class SteelBoxFactory extends AbstractFactory2{
 @Override
 public Box MakeBoxFactoryMethod() {
  // TODO Auto-generated method stub
  return new SteelBox();
 }
}
package abstractMethod_Series_level4;
//管理工厂
public  class MagicPipe {
// uml聚集 包含抽象工厂对象
 public AbstractFactory1 abstractFactory1;
 public AbstractFactory2 abstractFactory2;
// 传入某一个具体工厂 得到的是产品系列
 public void setAbstractFactory1(AbstractFactory1 abstractFactory1) {
  this.abstractFactory1 = abstractFactory1;
 }
 public void setAbstractFactory2(AbstractFactory2 abstractFactory2) {
  this.abstractFactory2 = abstractFactory2;
 }
// 公有接口
 public Ball pop(){
  System.out.println("准备创建中……");
  return abstractFactory1.MakeBallFactoryMethod();
 }
 public Box popBox(){
  System.out.println("准备创建中……");
  return abstractFactory2.MakeBoxFactoryMethod();
 }
}
package abstractMethod_Series_level4;
public abstract class Ball {
 public abstract void prtInfo();
}
package abstractMethod_Series_level4;
public class RubberBall extends Ball{
 public RubberBall() {
  System.out.println("创建了皮球");
 }
 public void prtInfo(){
  System.out.println("我是皮球");
 }
}
package abstractMethod_Series_level4;
public class SteelBall extends Ball{
 public SteelBall() {
  System.out.println("创建了钢球");
 }
 public void prtInfo(){
  System.out.println("我是钢球");
 }
}
package abstractMethod_Series_level4;
public abstract class Box {
 public abstract void prtInfo();
}
package abstractMethod_Series_level4;
public class RubberBox extends Box {
 public RubberBox() {
  System.out.println("创建了皮盒子");
 }
 public void prtInfo(){
  System.out.println("我是皮盒子");
 }
}
package abstractMethod_Series_level4;
public class SteelBox extends Box {
 public SteelBox() {
  System.out.println("创建了钢盒子");
 }
 public void prtInfo(){
  System.out.println("我是钢盒子");
 }
}
package abstractMethod_Series_level4;
public class Application {
public static void main(String[] args) {
 System.out.println("工厂1:a1 a2 \n" + "工厂2:b1 b2");
 System.out.println("欢迎进入坦克,请按下F键");
 //创建皮球 /皮盒子
 MagicPipe mp = new MagicPipe();
 AbstractFactory1 f1 = new RubberBallFactory();
 AbstractFactory1 f2 = new SteelBallFactory();
 AbstractFactory2 fbox1 = new RubberBoxFactory();
 AbstractFactory2 fbox2 = new SteelBoxFactory();
 
 mp.setAbstractFactory1(f1);
 mp.setAbstractFactory2(fbox1);
 Ball ball;
 Box box;
 ball = mp.pop();
 ball.prtInfo();
 box = mp.popBox();
 box.prtInfo(); 
}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值