初探设计模式——工厂模式

Pizza是超类型,CheesePizza、ClamPizza是其子类。
public abstract class Pizza{
	void prepare(){}
	void box(){}
}

得到一个具体对象:

Pizza cheesePizza=new CheesePizza();

得到多个具体对象:

Pizza pizza;	
if("cheese") 
	pizza=new CheesePizza();
else if("clam")
	pizza=new ClamPizza();
else if()...
如果要对Pizza类进行扩展就要在客户类中修改这段代码,违反了对修改封闭的原则
应用封装变化的原则,把这段具体实例化的过程抽离到一个类中,我们把这个类就叫工厂,用来处理创建对象的细节。

创建一个简单工厂,封装创建对象的代码,返回值为工厂产品

public class SimpleFactory{
	public Pizza createPizza(String type){	//通过这个方法实例化对象
		Pizza pizza =null;
		if(type.equals("cheese")){
			pizza=new CheesePizza();
		}else if(){}
		return pizza;
	}
}
		

这个工厂可以有很多客户,写一个PizzaStore客户不通过具体实例化来获得工厂产品

public class PizzaStore{
	SimplePizzaFactory factory;		//传入工厂类引用,用来获得pizza对象
	public PizzaStory(SimplePizzaFactory factory){
		this.factory=factory;			//将引用指向工厂对象
	}
	public Pizza orderPizza(String type){
		Pizza pizza;
		pizza=factory.creatPizza(type); 	//产生一个实例化对象并赋给pizza这个引用,这样客户中不需要出现具体实例化
		pizza.prepare();
		pizza.box();
		return pizza;
	}
}

这样通过PizzaStore就可以获得pizza对象,如果想要得到不同特色种的pizza只要多写几个简单工厂就行了

现在把PizzaStory作为超类,create方法变成抽象方法
这样通过继承这个超类,不同子类分别实现create方法也可以得到不同风味的pizza
把 orderPizza声明成final,prepare box等方法就被保证不被修改
public abstract class PizzaStore{
	public Pizza orderPizza(String type){
		Pizza pizza;

		pizza=createPizza(type);

		pizza.prepare();
		pizza.box();
		return pizza;
	}
	abstract Pizza createPizza(String type);
}

orderPizza实现了解耦,对修改封闭,对扩展开放。

工厂方法模式:定义一个创建对象的接口,但由继承来的子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

  • 依赖倒置原则:要依赖抽象,不要依赖具体类。
  • 变量不可以持有具体类的引用
  • 不要让类派生自具体类
  • 不要覆盖基类中已经实现的方法

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
定义一个接口,子类实现pizza原料的方法,将子类实例化后组合到抽象类Pizza和PizzaStory的子类中。
。。。。菜啊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值