工廠模式:
工廠這個對象通常就是一個用來創建其他對象的對象。
例如工廠通過使用一個人這個對象,如果我們需要一個男人,工廠就會幫我們創建一個男人;如果我們需要女人,就創建一個女人對象。
工廠模式又分爲:
普通工廠模式
多個工廠方法模式
靜態工廠方法模式
1、普通工廠模式
interface Animal{
public void eat();
public void sleep();
public void beat();
}
class Dog implements Animal{
@Override
public void eat() {
System.out.println("Dog can eat.");
}
@Override
public void sleep() {
System.out.println("Dog can sleep.");
}
@Override
public void beat() {
System.out.println("Dog can beat.");
}
}
class Cat implements Animal{
@Override
public void eat() {
System.out.println("Cat can eat.");
}
@Override
public void sleep() {
System.out.println("Cat can sleep.");
}
@Override
public void beat() {
System.out.println("Cat can beat.");
}
}
class AnimalFac{
public Animal createAnimal(String id){
if(id.equals("dog")){
return new Dog();
}
else if(id.equals("cat")){
return new Cat();
}
else{
System.out.println("Wrong input...");
return null;
}
}
}
public class AnimalFactory {
public static void main(String[] args){
AnimalFac fac = new AnimalFac();
Animal dog = fac.createAnimal("dog");
dog.beat();
dog.eat();
dog.sleep();
}
}
2、多個工廠模式(其實就是在工廠類改了一點)
interface Animal{
public void eat();
public void sleep();
public void beat();
}
class Dog implements Animal{
@Override
public void eat() {
System.out.println("Dog can eat.");
}
@Override
public void sleep() {
System.out.println("Dog can sleep.");
}
@Override
public void beat() {
System.out.println("Dog can beat.");
}
}
class Cat implements Animal{
@Override
public void eat() {
System.out.println("Cat can eat.");
}
@Override
public void sleep() {
System.out.println("Cat can sleep.");
}
@Override
public void beat() {
System.out.println("Cat can beat.");
}
}
class AnimalFac{
// public Animal createAnimal(String id){
// if(id.equals("dog")){
// return new Dog();
// }
// else if(id.equals("cat")){
// return new Cat();
// }
// else{
// System.out.println("Wrong input...");
// return null;
// }
// }
public Animal createDog(){
return new Dog();
}
public Animal createCat(){
return new Cat();
}
}
public class AnimalFactory {
public static void main(String[] args){
AnimalFac fac = new AnimalFac();
Animal dog = fac.createDog();
dog.beat();
dog.eat();
dog.sleep();
Animal cat = fac.createCat();
cat.sleep();
cat.eat();
cat.beat();
}
}
3、靜態工廠模式模式(main函數裏的聲明直接使用類去創建)
interface Animal{
public void eat();
public void sleep();
public void beat();
}
class Dog implements Animal{
@Override
public void eat() {
System.out.println("Dog can eat.");
}
@Override
public void sleep() {
System.out.println("Dog can sleep.");
}
@Override
public void beat() {
System.out.println("Dog can beat.");
}
}
class Cat implements Animal{
@Override
public void eat() {
System.out.println("Cat can eat.");
}
@Override
public void sleep() {
System.out.println("Cat can sleep.");
}
@Override
public void beat() {
System.out.println("Cat can beat.");
}
}
class AnimalFac{
// public Animal createAnimal(String id){
// if(id.equals("dog")){
// return new Dog();
// }
// else if(id.equals("cat")){
// return new Cat();
// }
// else{
// System.out.println("Wrong input...");
// return null;
// }
// }
public static Animal createDog(){
return new Dog();
}
public static Animal createCat(){
return new Cat();
}
}
public class AnimalFactory {
public static void main(String[] args){
Animal dog = AnimalFac.createDog();
Animal cat = AnimalFac.createCat();
// AnimalFac fac = new AnimalFac();
// Animal dog = fac.createDog();
dog.beat();
dog.eat();
dog.sleep();
// Animal cat = fac.createCat();
cat.sleep();
cat.eat();
cat.beat();
}
}
運行效果
總結:凡是出現了大量的產品需要創建,並且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對於第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。