工厂模式第二篇:”工厂方法”模式
对工厂模式的个人理解:
(1)工厂模式的核心在于“工厂”,通过“工厂类”的“工厂方法”创建“产品”对象(即让工厂方法返回“产品”对象)。工厂方法是“产品类”与“客户类”(需要某种产品的类)之间的桥梁。工厂方法返回一个具体的产品对象,以供客户类使用(往往客户类中含有一个抽象产品类的对象引用——然后将工厂方法返回的具体产品对象赋于该对象引用,在使用该对象引用调用具体产品类的方法)
(2)工厂模式中不一定非得需要把工厂方法写在工厂类中,可以直接把工厂方法封装在客户类中(结合实际想一下:一些客户也可以自己含有生产方法去生产自己想要的东西,而不一定非得去买别人制作成的)。以下的代码根据披萨制作介绍了工厂模式(将工厂方法封装在客户类中):
public abstract class pizza //抽象产品类pizza
{
//先声明一些pizza类的数据成员;
String name; //披萨的名字
String miantuantype; //该类型pizza所需要的面的类型
String zuoliaotype; //该类型pizza所需要的作料类型
public abstract void prepare(); //抽象方法,定义制作pizza所需的准备工作
public abstract void desc(); //抽象方法,描述该披萨
}
public class redpizza extends pizza //具体产品类
{
public redpizza() //在构造器中初始化继承自父类的数据成员
{
this.name="红披萨";
this.miantuantype="发面";
this.zuoliaotype="淡盐,酱油,芝麻酱";
}
@Override
public void prepare() {
System.out.println("这种披萨类型为:"+this.name);
System.out.println("我需要准备的东西有"+this.miantuantype);
}
@Override
public void desc() {
System.out.println("这是一个红披萨!!!!");
}
}
public class blackpizza extends pizza //具体产品类
{
public blackpizza()
{
this.name="黑披萨";
this.miantuantype="非发面";
this.zuoliaotype="酱油,味精,糖";
}
@Override
public void prepare() {
System.out.println("这是一个"+name+",需要准备的材料是黑颜料");
System.out.println("需要的面团类型为:"+miantuantype);
System.out.println("需要的作料类型为:"+this.zuoliaotype);
}
@Override
public void desc() {
System.out.println("这是一个黑披萨!!");
}
}
public abstract class pizzastore //抽象客户类,需要某种特定类型的产品
{
pizza pi;
public pizza orderpizza(String type) //决定提供那种类型的pizza,并且在该方法内对该类型的pizza做一些操作
{ //面向接口编程,都肯定会用到上转型和接口回调,即将子类对象传递给父类引用,
//然后让该引用调用子类中重写的父类的方法(或继承自父类的方法)
pi=pizzamake(type); //将工厂方法产生的“具体产品”类的对象赋于抽象产品类的对象引用(上转型对象)
pi.desc();
pi.prepare();
return pi;
}
abstract pizza pizzamake(String type); //pizza的制造工厂方法,根据传递进来的参数决定该方法返回那种类型的pizza
``````
//将工厂方法封装在"客户类"中!!!!!
}
public class pizzamaker1 extends pizzastore //具体客户类
{
@Override
pizza pizzamake(String type) {
if(type=="红披萨")
return new redpizza();
else if(type=="黑披萨")
return new blackpizza();
else
{
System.out.println("对不起,本店没有您想要的这种pizza");
return null;
}
}
}
public class test {
public static void main(String[] args) {
// TODO code application logic here
pizzastore pizzamaker01=new pizzamaker1(); //实例化一个“具体客户”对象并赋于抽象客户的对象引用(上转型对象)
pizzamaker01.orderpizza("红披萨"); //通过抽象客户的对象引用,调用具体客户中继承自抽象客户类中的方法(或是重写的方法)。
System.out.println();
pizzamaker01.orderpizza("黑披萨");
}
}