問題の問題が何度も取り上げられてきたことは知っているので、よく考えられているほど些細なことではないことは明らかです...
物事を明確にするために、同じファミリーの Bean と同じ概念を使用して、3 つの異なる実装 (単純なファクトリ、ファクトリ メソッド、抽象ファクトリ) の例を作成すると考えました。
次の例についてどう思いますか。あなたはそれらが明確で正しいと思いますか?
すべての例で、このファミリーの Bean を使用します
interface Vehicle
{
public void drive();
public void clean();
}
class Car implements Vehicle
{
@Override
public void drive()
{
System.out.println("Driving a car...");
}
@Override
public void clean()
{
System.out.println("Cleaning a car...");
}
}
class Bus implements Vehicle
{
@Override
public void drive()
{
System.out.println("Driving a Bus...");
}
@Override
public void clean()
{
System.out.println("Cleaning a Bus...");
}
}
シンプルファクトリー
/*client snippet*/
Vehicle car = VehicleFactory.getVehicle("small");
/*our factory*/
class VehicleFactory
{
public static Vehicle getVehicle(String criteria)
{
if ( criteria.equals("small") )
return new Car();
else if ( criteria.equals("big") )
return new Bus();
return null;
}
}
工場方式
//client Class
public class FactoryMethodPattern
{
public static void main(String[] args)
{
//handleCreator(new ConcreteCreator1())
handleVehicle(new CarFactory());
handleVehicle(new BusFactory ());
}
//handleCreator(Creator creator)
static void handleVehicle(VehicleDriver2 vDriver)
{
System.out.println("Handling a new vehicle. Pre lambda way");
vDriver.driveVehicle();
vDriver.cleanVehicle();
}
}
//client snippet
VehicleFactory v = new CarFactory();
Vehicle vehicle = v.getVehicle();
OR
VehicleFactory v = new CarFactory();
v.driveVehicle();
//creator
abstract class VehicleFactory
{
//the abstract method of the creator
public abstract Vehicle getVehicle();
public void driveVehicle()
{
getVehicle().drive();
}
public void cleanVehicle()
{
getVehicle().clean();
}
}
//concrete creator
class CarFactory extends VehicleFactory
{
@Override
public Vehicle getVehicle()
{
return new Car();
}
}
//concrete creator
class BusFactory extends VehicleFactory
{
@Override
public Vehicle getVehicle()
{
return new Bus();
}
}
アブストラクトファクトリー
抽象ファクトリの例では、これらの Bean を追加しました
interface Fuel
{
public void combust();
}
class Petrol implements Fuel
{
@Override
public void combust()
{
System.out.println("Petrol...");
}
}
class Gas implements Fuel
{
@Override
public void combust()
{
System.out.println("Gas...");
}
}
そして、ここに抽象ファクトリの例があります
//AbstractFactory
public abstract class AbstractFactory
{
abstract Fuel getFuel(String criteria);
abstract Vehicle getVehicle(String criteria) ;
}
//ConcreteFactory
public class VehicleFactory extends AbstractFactory
{
@Override
public Vehicle getVehicle(String criteria)
{
if(criteria == null)
{
return null;
}
if(criteria.equals("BIG"))
{
return new Bus();
}
else if(criteria.equals("SMALL"))
{
return new Car();
}
return null;
}
@Override
Color getFuel(String criteria)
{
return null;
}
}
//ConcreteFactory
public class FuelFactory extends AbstractFactory
{
@Override
public Vehicle getVehicle(String criteria)
{
return null;
}
@Override
Fuel getFuel(String criteria)
{
if(criteria == null)
{
return null;
}
if(criteria.equals("CHEAP"))
{
return new Gas();
}
else if(criteria.equals("EXPANSIVE"))
{
return new Petrol();
}
return null;
}
}
public class FactoryProducer
{
public static AbstractFactory getFactory(String criteria)
{
if(criteria.equalsIgnoreCase("VEHICLE"))
{
return new VehicleFactory();
}
else if(criteria.equalsIgnoreCase("FUEL"))
{
return new FuelFactory();
}
return null;
}
}
//client class
public class AbstractFactoryPatternDemo
{
public static void main(String[] args)
{
AbstractFactory vehicleFactory = FactoryProducer.getFactory("VEHICLE");
Vehicle car = vehicleFactory.getVehicle("SMALL");
car.dirve();
AbstractFactory fuelFactory = FactoryProducer.getFactory("FUEL");
Fuel petrol = colorFactory.getFuel("EXPANSIVE");
petrol.combust
}
}