主要介绍下面的三个设计模式:
(1)工厂模式与抽象工厂模式
(2)生成器模式
(3)单例模式
工厂模式
工厂模式可以分为简单工厂模式,工厂模式以及抽象工厂模式。
简单工厂模式
简单工厂模式的特点是仅仅有一个具体的创建者类,并且此类中包含一个静态的工厂方法factory().
首先定义一个接口
public interface food
{
abstract String getInsurInfo();
}
public class apple implements food
{
....
public String getInsurInfo();
}
public class meat implements food
{
...
public String getInsurInfo();
}
工厂类:
public class factory
{
public static food getInstance(String value)
{
food x = null;
if(value.compareTo("apple")==0)
{x=new apple();}
else if(value.compareTo("meat")==0)
{x=new meat();}
return x;
}
}
优点:
①工厂方法包含从一个类的结构中选择初始类的业务逻辑。
②客户类不直接创建产品类的对象,客户类只作为对象额消费者。、
③实现了责任分离。
④客户类不负有创建类的对象的责任,因此如果有新产品子类加入,不必修改已有的客户类代码(客户类暂时不使用新加的子类)。
⑤免除了客户类在创建类时的逻辑判断。
缺点:
①不符合开闭原则,每当增加产品类的时候,都需要修改工厂类的代码。
②因为工厂类的工厂方法是静态的,所有工厂类的方法不能被继承,简单工厂类只能是一个单独的类,而不能成为一个层次的类。
工厂方法模式
导致简单工厂方法模式不符合开闭原则的原因是工厂方法类只是一个实类,每当有一个新的产品类被加入到产品类当中,在工厂方法类中就必须增加适当的条件语句。所以在此基础上,我们可以将简单工厂方法模式中的单一工厂类改写为一个层次类来解决这个问题。
工厂类:
public interface factory()
{
public food getInstance();
}
public class appleFactory implements factory
{
public food getInstance(){return new food();}
}
public class meatFactory implements factory
{
public food getInstance(){return new meat();}
}
工厂模式与简单工厂模式的区别:
①工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类。并且在简单工厂模式中,工厂方法是静态的,而工厂模式中,方式是动态的。
②简单工厂模式不符合开闭原则,工厂模式符合开闭原则。
③简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中。在工厂模式中,工厂类不必包含创建对象的逻辑判断。
工厂模式的优点:
①将创建对象的逻辑与任务交给了工厂类。
②工厂方法模式支持开闭原则。
抽象工厂模式
抽象工厂模式与工厂方法模式有相似的概念,抽象工厂方法模式和工厂模式一样是层次类的结构,但是在这里他不仅仅负责创建一个产品类的对象,而是创建一族产品类的对象。
抽象工厂模式包括:
①一系列互相有关联的产品类,这些产品类有相同的结构。
②一系列实的工厂类,实现由抽象工厂类提供的接口。每个实的工厂类生产一组相关的产品类的对象。
public interface food
{
abstract String getInsurInfo();
}
public class apple implements food
{
....
public String getInsurInfo();
}
public interface food2
{
abstract String getInsurInfo();
}
public class apple2 implements food2
{
....
public String getInsurInfo();
}
工厂类:
public abstract class factory
{
public static final String food= "food";
public static final String food2= "food2";
public abstract food getFood();
public abstract food2 getFood2();
public static getInstrance(String type)
{
factory f = null;
if(type.equals(factory.food)){f=new foodfactory();}
else if(type.equals(factory.food2)){f=new food2factory();}
return f;
}
}
public class foodfactory extends factory
{
public food getFood()
{return new apple();}
public food2 getFood2()
{return new apple2();}
}
public class food2factory extends factory
{
public food getFood()
{return new apple();}
public food2 getFood2()
{return new apple2();}
}