设计模式——工厂模式(实例讲解)

对于Java设计模式中的工厂模式而言,针对类别可分为简单工厂模式,工厂方法模式。而对应抽象的话分为工厂方法模式,抽象工厂模式。
工厂模式其实就是,将类的实例化以及方法隐藏起来,通过new一个对象,实现用户需求。
这里通过一个例子对应列举简单工厂模式:

我们现在有一个订单,要求各种蛋糕,客户根据需求订购蛋糕,商家接收蛋糕订单,对应生产蛋糕。

1.首先创建产品(Cake)
父类:


public abstract class Cake {
	protected String name;

	public abstract void prepare();

	public void bake() {
		System.out.println(name + " baking...");
	}

	public void cut() {
		System.out.println(name + " cuting...");
	}

	public void setName(String name) {
		this.name = name;
	}

}

1.1列举一例产品:

public class cheeseCake extends Cake {
	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		System.out.print("cheeseCake is preparing ");
	}

}

2.将订单产品类实现(即是将用户所需的东西传送到工厂)


public class OrderCake {

	Cake cake;
	SingleFactory singleFactory;

	public OrderCake(SingleFactory singleFactory) {
		setFactory(singleFactory);
	}

	public void setFactory(SingleFactory singleFactory) {
		String type = "";
		this.singleFactory = singleFactory;
		do {

			type = getOrder();
			cake = this.singleFactory.creatCake(type);
			if (cake != null) {
				cake.bake();
				cake.cut();
			} else {
				System.out.print("订购失败");
				break;

			}

		} while (true);
	}

	@SuppressWarnings("resource")
	public String getOrder() {

		return new Scanner(System.in).nextLine();
	}

3.产品的制作,工厂实现


public class SingleFactory {

	public Cake creatCake(String orderType) {
		Cake cake = null;
		System.out.println("使用简单工厂模式");
		if (orderType.equals("cheese")) {
			cake = new cheeseCake();
			cake.setName(orderType);
		} else if (orderType.equals("piper")) {
			cake = new piperCake();
			cake.setName(orderType);
		}
		return cake;
	}
}

4.商店(实现需求,需求传送工厂)


public class store {

	public static void main(String[] args) {
		new OrderCake(new SingleFactory());
	}
}

对应当我们需求增加,例如我们的cake也有分区域,对应其实是增加产品需求。
例如 蛋糕的一些属性增加,比如北京的蛋糕或者伦敦的蛋糕。
这样一来为了避免耦合性,以及在源代码的基础上去修改,就需要搭建另一种框架,可以选择性抽象,,例如工厂抽象,或者方法抽象。
这里以方法抽象举例:

1.对应蛋糕的例子:
要对蛋糕类的方向抽象,具体实现交给子类

public abstract class cake {
	protected String name;

	public abstract void prepare();

	public void bake() {
		System.out.println(name + " baking...");
	}

	public void cut() {
		System.out.println(name + " cuting...");
	}

	public void setName(String name) {
		this.name = name;
	}
}

1.1列举一个子类:

public class LDchesscake extends cake{

	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		System.err.println("伦敦奶酪");
	}
        
}

2.订单的生成(分区域北京以及伦敦 就对应也要抽象orderstore)

public abstract class  ordercake {
         abstract cake creatcake(String orderType);
         
         public ordercake() {
        	 cake cake1=null;
        	 String orderType;
        	 do {
        		 orderType=getType();
        		 cake1=creatcake(orderType);
        		 cake1.prepare();
        		 cake1.bake();
        		 cake1.cut();
        	 }while(true);
        	 
        	 
         }
         public String  getType() {
        	 String orderString=null;
        	 Scanner scanner=new Scanner(System.in);
        	 orderString=scanner.nextLine();
        	 return orderString;
         }
}

3.商店实现;
对应需要什么蛋糕 ,new 那个类。。。

public class store {
	public static void main(String[] args) {
		new BJordercake();
	}
}

例子就这样了。。。。其实就是针对你发现这个类中的属性属于同级,可与其他一块并行,导致了区分度,这时候你可以将该方法抽象化,具体实现交给子类。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值